检测视图中的任何触摸(iPhone SDK)

bob*_*age 7 iphone objective-c

我目前正在使用......

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
Run Code Online (Sandbox Code Playgroud)

检测滑动.我已经把一切都搞定了.唯一的问题是如果用户触摸某些东西(例如UIButton或其他东西),- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {则不会调用它.是否有类似touchesBegan的东西,但如果我在视图中触摸任何地方,它会起作用吗?

大卫先生,谢谢你

Cos*_*que 13

触摸事件传播如下:

  1. UIViews以递归方式发送-hitTest:withEvent:直到某些UIView确定触摸在其边界内而不在任何启用用户交互的子视图内.
  2. UIWindow将-touchesBegan:withEvent:和朋友发送到步骤1中返回的UIView,忽略任何视图层次结构.

换句话说,-hitTest:withEvent:用于确定触摸的目标视图,之后目标视图获取所有-touches ...:withEvent: messages.如果您需要拦截可能在UIButton中开始的滑动手势,则必须覆盖-hitTest:withEvent:以返回self.

但是这种方法存在问题.一旦你这样做,你的按钮将停止工作,因为它不会得到任何-touches ...:withEvent:消息.除非您检测到滑动手势,否则您必须手动将触摸转发到子视图.这是一个严重的痛苦的屁股,并不保证完全工作.这就是UIGestureRecognizers的用途.

另一种方法是子类化UIWindow并覆盖-sendEvent : ,这可能在您的情况下更好地工作.

无论如何,请务必仔细阅读事件处理文档.其他可怕的警告说:

UIKit框架的类不是为了接收不受它们约束的触摸而设计的; 在程序方面,这意味着UITouch对象的view属性必须包含对框架对象的引用,以便处理触摸.