我希望能够识别界面中的所有触摸,无论触摸到什么内容。
我试过了:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
..但这只会识别用户点击不响应点击的内容(例如uiimages)
我需要这种能力的原因是,如果用户没有触摸屏幕5分钟,我想要进行幻灯片放映,所以我想在他们触摸时重置计时器。将此重置代码单独放在每个UI事件中似乎是错误的。
答案 0 :(得分:3)
您可以继承UIWindow
并覆盖sendEvent:
方法。
答案 1 :(得分:3)
有几种可能的解决方案,但正如@omz所说 - 覆盖sendEvent:
它是最好的解决方案。
@interface YourWindow : UIWindow {
NSDate timeOfLastTouch;
}
@end
@implementation YourWindow
- (void)sendEvent:(UIEvent *)event {
[super sendEvent:event];
NSSet *touches = [event allTouches];
UITouch *touch = [touches anyObject];
if( touch.phase == UITouchPhaseEnded ){
timeOfLastTouch = [NSDate date];
}
}
@end
不要忘记用YourWindow替换UIWindow。
答案 2 :(得分:1)
您可以继承UIWindow
并覆盖sendEvent:
方法,如下所示:
- (void)sendEvent:(UIEvent *)event {
if (event.type == UIEventTypeTouches) {
// You got a touch, do whatever you like
};
[super sendEvent:event]; // Let the window do the propagation of the event
}
答案 3 :(得分:1)
你可以使用点击手势
在您的界面中添加UIGestureRecognizerDelegate
@interface ViewController : UIViewController <UIGestureRecognizerDelegate> {
然后在你的viewDidLoad中添加这个
UITapGestureRecognizer *tapped = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapMethod)];
tapped.delegate=self;
tapped.numberOfTapsRequired = 1;
[self.view addGestureRecognizer:tapped];
然后在抽头方法中执行您的计时器代码
-(void)tapped {
//timer code
}
确保您的UI元素具有setUserInteractionEnabled:YES
答案 4 :(得分:1)
正如@Alladinian在其中一篇评论中所说的,iOS参考文档提到子类化UIApplication是正确的应用程序,因此,似乎更喜欢子类化UIWindow。比照https://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIApplication_Class/Reference/Reference.html:
您可能决定将UIApplication子类化为覆盖sendEvent:或 sendAction:to:from:forEvent:实现自定义事件和操作 调度。