有没有办法在iPhone上通过触摸?

我有几个UIButton ,我用它来设置当前的动作,当在主区域点击。 我也想让用户直接从button拖到主区域并采取相同的动作; 基本上,touchesBegan和touchesMoved应该在触摸UIButtons时传递到主视图,而且还应该发送button按下动作。

现在,我有修改控制的内容。 拖动出口调用触摸内部部分来设置控件,然后调用触摸开始部分来启动主要区域触摸操作。

不过,在这一点上,touchesMoved和touchesEnded显然没有被调用,因为触摸起源于UIButton。

有没有一种方法可以半点忽略这些接触,让它们传递到主要区域,而且还允许我先设置控件?

在文档中,查找响应者对象和响应者链

您可以通过将触摸向上转发给响应者链来“共享”对象之间的触摸。 你的UIButton有一个接收UITouch事件的响应者/控制器,我的猜测是,一旦它已经执行了对它返回的消息的解释 – 触摸已经被处理和处理了。

苹果build议这样的事情(根据当然的触摸types):

[self.nextResponder touchesBegan:touches withEvent:event];

触发事件不会被处理,而是被传递。

分类UIButton:

MyButton.h

 #import <Foundation/Foundation.h> @interface MyButton : UIButton { } - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event ; @end 

MyButton.m

 #import "MyButton.h" @implementation MyButton - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { printf("MyButton touch Began\n"); [self.nextResponder touchesBegan:touches withEvent:event]; } @end 

我知道这个问题是两岁(已经回答),但是…

当我自己尝试这个时,触摸被转发,但button不再像button一样。 我也通过触摸“超”,现在一切都很好。

所以,对于可能偶然发现的初学者来说,代码应该是这样的:

 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { [super touchesBegan:touches withEvent:event]; [self.nextResponder touchesBegan:touches withEvent:event]; } 

不需要子类化! 在其他任何事情之前,只需将其放在实现的顶部即可:

 #pragma mark PassTouch @interface UIButton (PassTouch) @end @implementation UIButton (PassTouch) - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { [super touchesBegan:touches withEvent:event]; [self.nextResponder touchesBegan:touches withEvent:event]; } - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { [super touchesMoved:touches withEvent:event]; [self.nextResponder touchesMoved:touches withEvent:event]; } - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { [super touchesEnded:touches withEvent:event]; [self.nextResponder touchesEnded:touches withEvent:event]; } - (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event { [super touchesCancelled:touches withEvent:event]; [self.nextResponder touchesCancelled:touches withEvent:event]; } @end