当平移手势识别器(我们称之为 SomePanGestureRecognizer
)被调用时,如何禁用或强制使 UIScrollView
中的手势识别器失败?
gestureRecognizer(_:shouldBeRequiredToFailBy
方法采用手势识别器参数,而不是平移手势识别器,我不知道这是我无法让它工作的原因还是因为我出现语法错误。
我有 UIScrollView
子类,用于强制失败的方法在下面的委托(delegate)中:
class CustomScrollView: UIScrollView {
override init(frame: CGRect) {
super.init(frame: frame)
configure()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
configure()
}
private func configure() {
isScrollEnabled = true
showsHorizontalScrollIndicator = false
showsVerticalScrollIndicator = false
isPagingEnabled = true
bounces = false
alwaysBounceVertical = false
alwaysBounceHorizontal = false
}
}
// gesture recognizer delegate
extension CustomScrollView: UIGestureRecognizerDelegate {
// allow simultaneous gestures
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
return true
}
// force failure
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldBeRequiredToFailBy otherGestureRecognizer: UIGestureRecognizer) -> Bool {
// TLDR: disable uiscrollview when SomePanGestureRecognizer is called
}
}
这是需要强制 UIScrollView
中的手势识别器失败的平移手势识别器:
func addSomePanGestureRecognizer() {
SomePanGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(oneBPanGestureHandler(gesture))
oneBHandle.addGestureRecognizer(SomePanGestureRecognizer)
}
更新我将 UIPanGestureRecognizer 子类化并使用同步委托(delegate)使其工作,但我担心这是一种不稳定的方法,因为我依赖 UIKit 在自定义平移手势之前始终禁用 UIScrollView .
// gesture recognizer delegate
extension CustomScrollView: UIGestureRecognizerDelegate {
// simultaneous gestures
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
if otherGestureRecognizer is CustomPanGestureRecognizer {
return false
} else {
return true
}
}
}
UPDATE 2 这也有效,但我不知道为什么,因为我觉得它不应该。不应该反过来吗?
// force failure
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRequireFailureOf otherGestureRecognizer: UIGestureRecognizer) -> Bool {
if otherGestureRecognizer is CustomPanGestureRecognizer {
return true
} else {
return false
}
}
我相信这就是您要找的:
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
let isPanAndOtherRecognizer = gestureRecognizer is UIPanGestureRecognizer && otherGestureRecognizer is SomePanGestureRecognizer
return !isPanAndOtherRecognizer
}
// force failure
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldBeRequiredToFailBy otherGestureRecognizer: UIGestureRecognizer) -> Bool {
let isPanAndOtherRecognizer = gestureRecognizer is UIPanGestureRecognizer && otherGestureRecognizer is SomePanGestureRecognizer
return isPanAndOtherRecognizer
}
关于ios - 如何禁用 UIScrollView 到平移手势识别器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46008225/
欢迎光临 OGeek|极客世界-中国程序员成长平台 (https://ogeek.cn/) | Powered by Discuz! X3.4 |