2017-09-01 75 views
0

当平局手势识别器被称为SomePanGestureRecognizer时,如何禁用或强制手势识别器在UIScrollView中失败?如何禁用UIScrollView到平移手势识别器?

gestureRecognizer(_:shouldBeRequiredToFailBy:)方法需要一个手势识别器参数,而不是一个平移手势识别器,我不知道这是为什么我不能让它工作或因为我犯了一个语法错误。

我有UIScrollView子类,而用于强制方法失败是在下面的委托:

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) 
} 



UPDATE我将UIPanGestureRecognizer子类化并使用同时委托来工作,但我担心这是一种不稳定的方式,因为我依靠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 
     } 

    } 

} 


更新2这也适用,但我不知道为什么,因为我觉得它不应该。难道不是相反吗?

// force failure 
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRequireFailureOf otherGestureRecognizer: UIGestureRecognizer) -> Bool { 

    if otherGestureRecognizer is CustomPanGestureRecognizer { 
     return true 
    } else { 
     return false 
    } 

} 
+0

'UIPanGestureRecognizers'是UIGestureRecognizer'的'子类。这不是问题。 – PeejWeej

回答

0

我相信这是你在找什么:

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 
} 
+0

编译错误:SomePanGestureRecognizer是一个未声明的类型 – sconewolf

+0

这是您指定的类。使用任何你自己的子类。 – PeejWeej

+0

我希望UIScrollView中的未命名的手势识别器无法使用平移手势识别器SomePanGestureRecognizer。我们不能在同一页面上,因为这不起作用。 – sconewolf

相关问题