UIView – “启用用户交互”的父母,但真正的孩子?
看起来,父视图上的userInteractionEnabled = NO将阻止用户在所有子视图上进行交互。 它是否正确? 有没有办法解决?
这是正确的,父视图上的userInteractionEnabled设置为NO将级联到所有子视图。 如果您需要一些子视图来启用交互function,但不需要其他子视图,则可以将子视图分为两个父视图:一个使用userInteractionEnabled = YES,另一个使用“否”。 然后把这两个父视图放在主视图中。
您可以inheritanceUIView并重写hitTest:withEvent:将触摸事件传递给您指定的视图(_backView):
-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { UIView* view = [super hitTest:point withEvent:event]; if(view == self) { view = _backView; } return view; }
如果触摸事件被这个视图处理,它将被传递给“_backView”(可以是一个IBOutlet,因此可以使用接口生成器来设置)。 如果是由任何子视图处理,只是返回该孩子( [super hitTest:point withEvent:event]
;)
只要您知道您需要传递事件的视图,这个解决scheme就没有问题。 除此之外,不知道它是否有问题,因为我们正在返回一个视图(_backView)不是当前UIView子视图! 但在我的情况下,它工作得很好。
一个更好的解决scheme可能是在UIView背景上禁用触摸中提到的一个, 以便较低视图上的button是可点击的其中提到使用-pointInside:withEvent:
相比以前的解决scheme,它更好的方式,你不需要指定一个'_backView'来接收事件(该事件只是传递到链中的下一个视图)! 缺点可能是我们需要在所有子视图中执行-pointInside:withEvent:
虽然可能是微不足道的开销)
我遇到了一个奇怪的情况。 我有一个UIView(调用这个V),它有一个UIButton作为子视图。 调用这个UIButton,buttonX.下面是我用于buttonX的目标/select器的方法。self下面是视图V. sender参数是buttonX.
导致我一个问题的情况是,如果我触摸我的用户界面上的另一个button(在导航栏上,调用此buttonY),然后非常快速地触摸buttonX,其中buttonY行动禁用视图V,我仍然得到触摸事件发送到buttonX.
- (void) buttonAction: (UIButton *) sender { NSLog(@"superview: %d", sender.superview.userInteractionEnabled); NSLog(@"button itself: %d", sender.userInteractionEnabled); // <snip> }
这是输出:
2014-12-19 16:57:53.826 MyApp [6161:960615] superview:0
2014-12-19 16:57:53.826 MyApp [6161:960615]button本身:1
也就是说,发生了button操作,button的超级视图禁止了用户交互! 而子视图仍然有用户交互启用!
对于那些你认为这似乎是人为的,在我的应用程序的用户界面上运行的iPad(运行iOS 8.1.2),这是在我使用该应用程序意外。 这不是我最初试图产生的东西。
思考?
我目前的解决方法如下,但它是必要的,似乎很奇怪!
- (void) buttonAction: (id) sender { NSLog(@"superview: %d", sender.superview.userInteractionEnabled); NSLog(@"button itself: %d", sender.userInteractionEnabled); if (! self.userInteractionEnabled) return; // <snip> }
- 在NSArray中select一个随机对象
- “EXC_BREAKPOINT(SIGTRAP)”由debugging断点引起的exception吗?
- 如何在UIBarButtonItem中将UIGestureRecognizer添加到iPad应用程序中常见的撤销/重做UIPopoverControllerscheme中?
- UIButton:使命中区域大于默认命中区域
- 如何创buildNSIndexPath所需的“索引”:indexPathWithIndexes:length:
- 如何从NSFileHandle逐行读取数据?
- ARC下归零弱引用的集合
- @synthesized实例variables的可见性是什么?
- 你可以在Ruby中开发原生的iPhone应用程序吗?