iOS如何在子视图处理后忽略父视图接收触摸事件

时间:2017-02-07 04:02:49

标签: ios swift

请看下面的图片:

enter image description here

我有一个自定义UIControl作为RangeSlider,我是按照this教程实现的。我将RangeSlider置于可以滑入或滑出的FilterViewController内。

在课程RangeSlider上,当用户移动滑块指示符时,我使用UIControlbeginTracking, continueTracking, endTracking的3种方法来处理触摸事件。

在课程FilterViewController上,我使用UIPanGestureRecognizer来处理用户滑入或滑出时的触摸事件。

问题

当我尝试移动滑块指示器时,ViewController也会移动。指标只是移动了一下。它似乎是子视图和父视图都接收到触摸事件。

问题

如何忽略父视图(ViewController)接收触摸事件?

3 个答案:

答案 0 :(得分:0)

您应该实现PanGestureRecognizer委托的方法

  

gestureRecognizerShouldBegin(_:)

编辑:请尝试

override func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
    guard let view = gestureRecognizer.view, view.isKind(of: UIControl.self) else {
        return true
    }
    return false
}

希望这有帮助。

答案 1 :(得分:0)

你可以在viewDidLoad()中写这个。

self.view.isUserInteractionEnabled = false

答案 2 :(得分:-1)

这应该在FilterViewController中有所帮助(假设它是触摸委托)

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
    if ([touch.view isDescendantOfView:self.tableView]) {
        return NO;
    }

    return YES;
}

很抱歉,例如在objective-c中,您可以轻松将其转换为swift。这意味着您使用的表或滚动视图不会对其子视图的触摸作出反应(假设RangeSlider是表视图单元的后代子视图)。让我知道,如果这没有帮助,我通过几种不同的方式强迫过去这些问题!