【问题标题】:UIPageViewController Swipe Conditional On UIScrollViewUIPageViewController 在 UIScrollView 上有条件地滑动
【发布时间】:2016-04-19 11:12:38
【问题描述】:

我看到了一个类似的问题here,但没有有效的解决方案。

我有一个嵌入在UIPageViewController 中的UIScrollView。我希望用户能够正常滚动UIScrollView。然后,如果到达UIScrollView 的一端(例如,一直向左),然后向左滑动(向右滑动,但你明白我的意思)将触发UIPageViewController 向左移动到另一页。

默认行为有点粗略。手势识别器似乎在竞争,在某些情况下UIScrollView 确实滚动,而在其他情况下,PageView 只是切换到下一页。我希望能够将此行为与UIScrollView 的内容偏移量联系起来。

我将尝试在各种手势识别器上使用 requireFail 方法进行一些实验,但似乎所有 PageView 的手势识别器属性都被取消了,因为我使用的是滚动转换类型。那么...走层次结构?

无论如何,如果有人知道一个简单的解决方案,我将不胜感激。

【问题讨论】:

    标签: ios objective-c uiscrollview uipageviewcontroller


    【解决方案1】:

    我最终解决此问题的方法是使用 UIPageViewController 的替代品:EMPageViewController。因为我可以直接访问UIScrollView,所以我可以继承它。

    解决方案基本上来自于子类化并向UIScrollViews(EMPageViewController 的一个和它内部的一个)添加切换标志,以根据各种因素(例如滚动视图之一的内容偏移量)。然后我能够在UIScrollView 子类中以不同方式覆盖gestureRecognizerShouldBegin:gestureRecognizer,检查切换标志和平移手势识别器的速度。

    类似这样的东西(代码断章取义):

    import UIKit
    
    class CustomScrollView: UIScrollView {
    
        // these toggles get set by some senior ViewController
        var lockDown = false
        var lockUp = false
    
        override func gestureRecognizerShouldBegin(gestureRecognizer: UIGestureRecognizer) -> Bool {
            print("= gesture starting")
            if let panner = gestureRecognizer as? UIPanGestureRecognizer {
                if panner.velocityInView(self).y < 0.0 {
                    print("== pulling down, lockDown: \(lockDown)")
                    if lockDown {
                        print("=== cancelling paging scroll")
                        return false
                    }
                }
                if panner.velocityInView(self).y > 0.0 {
                    print("== pulling up, lockUp: \(lockUp)")
                    if lockUp {
                        print("=== cancelling paging scroll")
                        return false
                    }
                }
            }
    
            return super.gestureRecognizerShouldBegin(gestureRecognizer)
        }
    
    }
    

    无论如何,我最终还是顺利完成了所有工作。每个人的用例可能略有不同,但底线是您需要继承 UIScrollView 的子类,因此不能选择 UIPageViewController

    【讨论】:

      猜你喜欢
      • 2016-06-12
      • 2018-11-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多