检测屏幕上任何位置的触摸

时间:2014-10-14 15:40:06

标签: ios objective-c cocoa-touch uigesturerecognizer uiresponder

我想知道用户何时触摸了我应用的屏幕上的任何位置。

我已经研究过使用 - (UIResponder *)nextResponder ,但遗憾的是这不起作用,因为我也会自动重新加载一个表,所以当发生这种情况时会触发它。

我还尝试过手势识别器,其代码如下。但这只会识别视图中的触摸。我有许多按钮,用户将用它来操作应用程序。我想避免在屏幕上的每个按钮和段控件中添加手势识别器或代码

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapOnView:)];
[self.mainView addGestureRecognizer:tap];

- (void)tapOnView:(UITapGestureRecognizer *)sender
{
    //do something
}

我也试过 - (void)touchesBegan :( NSSet *)触及withEvent:(UIEvent *)事件,但这与手势识别器有同样的问题。

我想知道是否有任何办法可以完成这项任务。我希望我能够从nextResponder中识别事件的类型,然后我可以检测它是否是按钮。

编辑:我正在处理此问题的原因是我的应用需要保持活动状态并且屏幕无法锁定(因此我禁用了屏幕锁定)。为了避免过度使用电源,我需要调暗屏幕,但是一旦触摸应用程序,然后将亮度恢复到原始水平。我只需要在我的一个视图控制器上使用此功能。

4 个答案:

答案 0 :(得分:10)

正如Ian MacDonald所提到的,使用UIWindow是一个很好的解决方案,可以在应用程序范围内检测用户交互,包括选择按钮,文本字段等时。

我的解决方案是继承- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { // do your stuff here // return nil if you want to prevent interaction with UI elements return [super hitTest:point withEvent:event]; } 并实现hitTest方法。

{{1}}

答案 1 :(得分:3)

您可以将UITapGestureRecognizer附加到[[UIApplication sharedApplication] keyWindow]

或者,您可以覆盖根hitTest:的{​​{1}}。

您希望完成一项特殊任务吗?可能有一种更好的方式,而不是分配任何地方"手势。

修改:使用UIView

hitTest:

答案 2 :(得分:2)

您的修改会为您的问题增加更多清晰度。

  

我正在处理此问题的原因是我的应用需要保持活跃状态   并且屏幕无法锁定(因此我禁用了屏幕锁定)。   为避免过度使用电源,我需要调暗屏幕,但随后   一旦应用程序将亮度恢复到原始水平   触摸。

由于您正在控制屏幕亮度,因此您可以在根控制器顶部的调光屏幕之前添加一个透明视图控制器,该控制器仅执行一项作业,使用点击手势收听。然后,您可以关闭视图控制器并将亮度调整到以前的状态。

通过这样做,您不必担心点击按钮,因为它们将位于透明视图控制器下方。由于它是一个位于堆栈顶部的全新视图控制器,因此您也不必修改现有代码。

答案 3 :(得分:1)

好的我之前遇到过类似的问题。

我记得我将UIWindow子类化为全屏检测并将其设为第一响应者

比我重写了要从子类处理的触摸

您还可以使用代码识别被触摸的控件

#import <QuartzCore/QuartzCore.h>

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self.view setMultipleTouchEnabled:YES];
}

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

    // Enumerate over all the touches 
    [touches enumerateObjectsUsingBlock:^(id obj, BOOL *stop) {
        // Get a single touch and it's location
        UITouch *touch = obj;
        CGPoint touchPoint = [touch locationInView:self.view];
        ...
    }];
}

禁用屏幕锁定我在下面使用了代码:

[[UIApplication sharedApplication] setIdleTimerDisabled:YES];

我使用以下功能调暗或增加屏幕亮度

[[UIScreen mainScreen] setBrightness:0.0f]; //and
[[UIScreen mainScreen] setBrightness:1.0f];