ScrollView v 自定义转换 (Swift)
Posted
技术标签:
【中文标题】ScrollView v 自定义转换 (Swift)【英文标题】:ScrollView v Custom Transition (Swift) 【发布时间】:2018-10-23 02:29:09 【问题描述】:我正在制作一个应用程序,您基本上可以在其中回答问题,然后向左滑动以获取下一个问题。我喜欢滚动视图的过渡,并想效仿。我想知道是否建议在视图控制器之间创建自定义转换,或者只实现滚动视图。
滚动视图似乎更容易,但在考虑以下注意事项时不确定是否可能(或者实际上是否更容易)。
一些注意事项: - 只能滑动一个方向(不能回到以前的问题) - 滑动后需要能够从数据源加载另一个问题(显然) - 没有固定数量的问题(因此他们可以永远滑动并不断收到新问题)
谢谢
【问题讨论】:
【参考方案1】:阅读您的要求后,最合适的 UI 小部件将是 UICollectionView
。
这里有一些点可以帮助你掩盖你的要求。
1.调整单元格大小
您可能希望在整个视图中显示与问答相关的视图,在这种情况下,您的集合视图将被固定到 top
、bottom
、left
、right
,并带有约束和您的单元格大小将等于集合视图边界的大小。
实现UICollectionViewFlowLayoutDelegate
的delegate
func collectionView(_ collectionView: UICollectionView,
layout collectionViewLayout: UICollectionViewLayout,
sizeForItemAt indexPath: IndexPath) -> CGSize
return collectionView.bounds.size
2。启用分页
启用collectionView的分页,这样滚动就不会停留在任何中断处(即滚动停止在两个问题单元格之间)。
collectionView.isPagingEnabled = true
3.锁定滚动方向(仅向右滚动)
如果你的目标是ios 11.0+
,你可以看看@UICollectionViewDragDelegate
(appledoc),它将提供丰富的功能来实现这一目标。
否则我建议你使用以下
public func scrollViewDidScroll(_ scrollView: UIScrollView)
这将通知您在您的CollectionView
中进行的每个滚动用户。这是来自UIScrollView
的方法,UICollectionView
继承自UIScrollView
。
var lastOffsetX = -1
public func scrollViewDidScroll(_ scrollView: UIScrollView)
// for the first time only
if lastOffset < 0
lastOffsetX = scrollView.contentOffset.x
return
if lastOffset > scrollView.contentOffset.x
// stick to the right most position -- not enabling the user to go left
scrollView.contentOffset.x = lastOffset
else
// take the user ahead to the right position
lastOffset = scrollView.contentOffset.x
以这种方式处理时,您可能会遇到一个问题,即在 scrollViewDidScroll
中设置 contentOffset 可能最终会触发 scrollViewDidScroll
方法。如果您遇到这种情况,您可以查看this answer。当然我没有运行这段代码,但几乎没有例外,它应该可以工作。
希望对您有所帮助,祝您编码愉快。
【讨论】:
【参考方案2】:UIPageViewController
可能是一个好方法。
始终为viewControllerBefore
返回nil
,以防止“向后滑动”。
为viewControllerAfter
返回nil
,直到用户回答了当前问题以防止提前“滑动”。
【讨论】:
以上是关于ScrollView v 自定义转换 (Swift)的主要内容,如果未能解决你的问题,请参考以下文章
Swift - Parallax Header View - ScrollView 重叠单元格
将 DataSnapshot 转换为自定义结构对象 - Swift 4