UIPageViewController在UIScrollView上滑动条件

时间:2016-01-14 07:57:47

标签: ios objective-c uiscrollview uipageviewcontroller

我见过类似问题here,但没有可行的解决方案。

我有UIScrollView嵌入UIPageViewController。我希望用户能够正常滚动UIScrollView。然后,如果到达UIScrollView的一端(例如,一直到左边),那么向左滑动(向右滑动,但你理解我的意思)会触发UIPageViewController向左移动到另一页。

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

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

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

1 个答案:

答案 0 :(得分:0)

我最终解决此问题的方法是使用UIPageViewControllerEMPageViewController的替代品。因为我可以直接访问UIScrollView,所以我能够将其子类化。

该解决方案基本上是在子类化中添加切换标志并向UIScrollView添加切换标志(EMPageViewController和其中一个)以控制它们何时应该是活动的,基于各种因子(例如其中一个滚动视图的内容偏移量)。然后我能够在gestureRecognizerShouldBegin:gestureRecognizer子类中以不同的方式覆盖UIScrollView,检查切换标记和平移手势识别器的速度。

这样的事情(代码脱离背景):

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不是一个选项。