我见过类似问题here,但没有可行的解决方案。
我有UIScrollView
嵌入UIPageViewController
。我希望用户能够正常滚动UIScrollView
。然后,如果到达UIScrollView
的一端(例如,一直到左边),那么向左滑动(向右滑动,但你理解我的意思)会触发UIPageViewController
向左移动到另一页。
默认行为有点粗略。似乎手势识别器竞争,在某些情况下UIScrollView
会滚动,而在其他情况下,PageView只会转移到下一页。我希望能够将此行为与UIScrollView
或其他内容的内容偏移量联系起来。
我将尝试在各种手势识别器上使用requireFail
方法进行一些实验,但似乎所有PageView的手势识别器属性都没有用,因为我正在使用滚动转换类型。那么......走层次结构?
无论如何,如果有人知道一个简单的解决方案,我会很感激。
答案 0 :(得分:0)
我最终解决此问题的方法是使用UIPageViewController
:EMPageViewController的替代品。因为我可以直接访问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
不是一个选项。