我一直在尝试定制交互视图控制器演示和解雇(使用的组合UIPresentationController,UIPercentDrivenInteractiveTransition,UIViewControllerAnimatedTransitioning,和UIViewControllerTransitioningDelegate),并大多得到的东西我需要运作良好.
但是,有一个常见的场景我还没有在我阅读的任何教程或文档中找到解决,引出了以下问题:
...
当被解除的视图包含UIScrollView(即UITableView,UICollectionView,WKWebView等)时,通过平移手势处理自定义交互式视图控制器解除的正确方法是什么?
...
基本上,我想要的是以下内容:
通过平移它们可以交互式地禁止视图控制器.这是许多应用程序中常见的UX.
如果被解除的视图控制器包含(垂直滚动)滚动视图,则向下平移滚动该视图按预期直到用户到达顶部,之后滚动停止并且发生泛消除.
否则,滚动视图应该正常运行.
我知道这在技术上是可行的 - 我已经在其他应用程序中看到了它,例如Overcast和Apple自己的音乐应用程序 - 但是我找不到协调我的平移手势与滚动的行为的关键视图(一个或多个).
我自己的大多数尝试都集中在试图有条件地启用/禁用contentOffset.y滚动视图(或其相关的平移手势识别器)基于其滚动时让视图控制器解雇的平移手势识别器从那里接管,但这已经充满了问题和我担心我会过度思考它.
我觉得秘密主要在于以下平移手势识别器委托方法:
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
// ...
}
Run Code Online (Sandbox Code Playgroud)
我创建了一个简化的示例项目,该项目应该更清楚地演示场景.任何代码建议都非常欢迎!
uiscrollview uiviewcontroller ios uipangesturerecognizer swift
有一种常见的处理滚动的方法,UICollectionView这样当用户停止滚动时,它会逐渐减慢速度,并停止在集合视图中最近的项目与集合视图边界的边缘对齐的位置。
这与页面视图的不同之处在于,用户可以通过单次滑动快速滚动浏览连接视图中的多个项目,并且屏幕上会同时显示多个项目。
您可以在苹果自己的应用程序中看到这一点:电视、音乐、书籍和播客在每个各自的应用程序中浏览水平列表时都表现出这种行为。
使用UICollectionView(或UIScrollView,但在集合视图中更常见),通常使用该scrollViewWillEndDragging(scrollView:velocity:targetContentOffset:)方法来实现,以检测用户何时停止滚动并为其提供要滚动到的更新的目标偏移量。
以下问题的最佳答案(作者:Rob Mayoff)详细描述了这一点:
我的问题:如何使用 SwiftUI 的 ScrollView 做到这一点?
我有一个水平 ScrollView,其中包含一个 HGrid,其中包含一组项目。我想实现一个类似于苹果应用程序中的水平浏览器。我可以使用 UICollectionView 来完成此操作,如上所述,但更喜欢在 SwiftUI 中“本地”执行此操作,而不包装 UICollectionView。
我希望使用 ScrollViewReader 和某种方式可以做到这scrollTo(_:anchor:)一点,但它似乎没有任何东西可以满足这种需求。
这种行为是否可以使用 SwiftUI 本地实现,如果可以的话,如何实现?
scrollview uiscrollview uicollectionview swiftui scrollviewreader