ScrollView v 自定义转换 (Swift)

Posted

技术标签:

【中文标题】ScrollView v 自定义转换 (Swift)【英文标题】:ScrollView v Custom Transition (Swift) 【发布时间】:2018-10-23 02:29:09 【问题描述】:

我正在制作一个应用程序,您基本上可以在其中回答问题,然后向左滑动以获取下一个问题。我喜欢滚动视图的过渡,并想效仿。我想知道是否建议在视图控制器之间创建自定义转换,或者只实现滚动视图。

滚动视图似乎更容易,但在考虑以下注意事项时不确定是否可能(或者实际上是否更容易)。

一些注意事项: - 只能滑动一个方向(不能回到以前的问题) - 滑动后需要能够从数据源加载另一个问题(显然) - 没有固定数量的问题(因此他们可以永远滑动并不断收到新问题)

谢谢

【问题讨论】:

【参考方案1】:

阅读您的要求后,最合适的 UI 小部件将是 UICollectionView

这里有一些点可以帮助你掩盖你的要求。

1.调整单元格大小

您可能希望在整个视图中显示与问答相关的视图,在这种情况下,您的集合视图将被固定到 topbottomleftright,并带有约束和您的单元格大小将等于集合视图边界的大小。

实现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 重叠单元格

转换为 Swift 3 破坏了自定义类编码/解码

将 DataSnapshot 转换为自定义结构对象 - Swift 4

Swift - 如何垂直转换(翻转)自定义 UITableViewRowAction

如何在 Swift 5 中将文档转换为自定义对象?

Swift 4 如何将自定义对象数组转换为 JSON