我想,当一个视图被触摸或轻敲,其处理程序先被调用,然后它的父的处理程序被调用(向上传播)。
但是,这是真的,如果上海华盈的userInteractionEnabled
设置为NO,那么所有的子视图和后代也为用户交互禁用? 如果我们想要禁用的只是主视图,但不希望以禁用子视图?
我想,当一个视图被触摸或轻敲,其处理程序先被调用,然后它的父的处理程序被调用(向上传播)。
但是,这是真的,如果上海华盈的userInteractionEnabled
设置为NO,那么所有的子视图和后代也为用户交互禁用? 如果我们想要禁用的只是主视图,但不希望以禁用子视图?
你不能做到这一点,
相反,你会改变你的看法类似以下的布局研究:
Main View-> subViews
至
Container View -> Main View that you want to set as inactive
-> other views that you want to still active
所以,你的当前主视图,你当前的子视图将成为兄弟姐妹,一个新的容器视图的孩子
如果这可能是有帮助的,我在由马特·诺伊堡,对编程的iOS 5中这一点。 467:
userInteractionEnabled
如果设置为NO,该视图(与它的子视图一起)被排除在接收触摸。 这一观点倒是和它的子视图的一个“贯穿”到它背后的景色。
更进一步,苹果公司的事件处理指南适用于iOS说:
窗口对象使用命中测试和响应链,找到视图接收触摸事件。 在命中测试,一个窗口调用则hitTest:withEvent:方法对视图层次的最顶层的视图。 这种方法进行的递归调用pointInside:withEvent:方法在返回YES,继续向下的层次结构,直到它找到它的边界内的触摸发生的子视图视图层次的每个视图。 这种观点成为hit-test视图。
和编程的iOS 5由Matt诺伊堡,p.485提到,如果一个视图被标记userInteractionEnabled
为NO
,或hidden
作为YES
,或不透明度是接近0,则视图及其子视图不会被遍历HitTest
(并且因此不考虑任何触摸)。
您可以覆盖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
}
}
第一种方法
- (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];