在iOS上,如果上海华盈的userInteractionEnabled是NO,那么所有的子视图被停用

2019-06-25 03:42发布

我想,当一个视图被触摸或轻敲,其处理程序先被调用,然后它的父的处理程序被调用(向上传播)。

但是,这是真的,如果上海华盈的userInteractionEnabled设置为NO,那么所有的子视图和后代也为用户交互禁用? 如果我们想要禁用的只是主视图,但不希望以禁用子视图?

Answer 1:

你不能做到这一点,

相反,你会改变你的看法类似以下的布局研究:

Main View-> subViews

Container View -> Main View that you want to set as inactive
               -> other views that you want to still active

所以,你的当前主视图,你当前的子视图将成为兄弟姐妹,一个新的容器视图的孩子



Answer 2:

如果这可能是有帮助的,我在由马特·诺伊堡,对编程的iOS 5中这一点。 467:

userInteractionEnabled

如果设置为NO,该视图(与它的子视图一起)被排除在接收触摸。 这一观点倒是和它的子视图的一个“贯穿”到它背后的景色。

更进一步,苹果公司的事件处理指南适用于iOS说:

窗口对象使用命中测试和响应链,找到视图接收触摸事件。 在命中测试,一个窗口调用则hitTest:withEvent:方法对视图层次的最顶层的视图。 这种方法进行的递归调用pointInside:withEvent:方法在返回YES,继续向下的层次结构,直到它找到它的边界内的触摸发生的子视图视图层次的每个视图。 这种观点成为hit-test视图。

和编程的iOS 5由Matt诺伊堡,p.485提到,如果一个视图被标记userInteractionEnabledNO ,或hidden作为YES ,或不透明度是接近0,则视图及其子视图不会被遍历HitTest (并且因此不考虑任何触摸)。



Answer 3:

您可以覆盖hitTest(_:withEvent:)忽略视图本身,但仍提供触摸到它的子视图。

class ContainerStackView : UIStackView {
    override func hitTest(point: CGPoint, withEvent event: UIEvent?) -> UIView? {
        let result = super.hitTest(point, withEvent: event)
        if result == self { return nil }
        return result
    }
}


Answer 4:

第一种方法

- (BOOL) gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
  if ([touch.view.superview isKindOfClass:[SuperViewParent class]]) return FALSE;
  return TRUE;
}

第二种方法

UITapGestureRecognizer *r = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(agentPickerTapped:)];
    r.cancelsTouchesInView = NO;
    [agentPicker addGestureRecognizer:r];


文章来源: On iOS, if a superview's userInteractionEnabled is NO, then all subviews are disabled as well?