1

我不在乎按下了哪个键,按下了多长时间,或者类似的东西。我所需要的只是一种检测用户是否触摸了屏幕的方法,即使它恰好位于被键盘覆盖的屏幕部分。

我的目标是检测缺少交互以将应用程序“重置”到默认状态,如果离开足够长的时间 - 考虑一个“信息亭模式”应用程序。问题是我无法检测到键盘何时被触摸,因为键盘显然会拦截所有触摸事件,甚至在我的客户窗口可以处理它们之前。

编辑:

考虑(并忽略)仅使用键盘显示和隐藏通知——如果用户正在积极打字,我们需要延长屏幕显示。由于我们使用 UIWebViews 来显示某些东西,所以我们也不能使用 UITextViews 或 UITextFields 的委托方法。

4

3 回答 3

3

听起来好像检测到键盘和其他地方的所有触摸就足够了。我们可以通过继承UIApplication覆盖来做到这一点sendEvent:

我们将UIApplicationDelegate使用新消息扩展协议application:willSendTouchEvent:,并让我们的UIApplication子类在处理任何触摸事件之前将消息发送给它的委托。

我的应用程序.h

@interface MyApplication : UIApplication
@end

@protocol MyApplicationDelegate <UIApplicationDelegate>
- (void)application:(MyApplication *)application willSendTouchEvent:(UIEvent *)event;
@end

我的应用程序.m

@implementation MyApplication

- (void)sendEvent:(UIEvent *)event {
    if (event.type == UIEventTypeTouches) {
        id<MyApplicationDelegate> delegate = (id<MyApplicationDelegate>)self.delegate;
        [delegate application:self willSendTouchEvent:event];
    }
    [super sendEvent:event];
}

@end

我们需要让我们的应用委托符合MyApplicationDelegate协议:

AppDelegate.h

#import "MyApplication.h"

@interface AppDelegate : UIResponder <MyApplicationDelegate>
// ...

AppDelegate.m

@implementation AppDelegate

- (void)application:(MyApplication *)application willSendTouchEvent:(UIEvent *)event {
    NSLog(@"touch event: %@", event);
    // Reset your idle timer here.
}

最后,我们需要让应用程序使用我们的新MyApplication类:

主文件

#import "AppDelegate.h"
#import "MyApplication.h"

int main(int argc, char *argv[])
{
    @autoreleasepool {
        return UIApplicationMain(argc, argv,
            NSStringFromClass([MyApplication class]),
            NSStringFromClass([AppDelegate class]));
    }
}
于 2012-09-11T01:40:39.867 回答
2

使用keyboardShow 和keyBoardHide Notifications 来设置计时器怎么样?x 秒后,您将应用程序返回到所需的状态。

如果您愿意,甚至可以重置滚动视图代表或文本字段代表中的计时器。

看一眼:

[[NSNotificationCenter defaultCenter] addObserver:self 
                                  selector:@selector(keyboardDidShow:) 
                                      name:UIKeyboardDidShowNotification 
                                    object:nil];    

和这样的方法:

- (void)keyboardDidShow:(NSNotification *)note {
    idleTimer = [NSTimer scheduledTimerWithTimeInterval:120 
                         target:nil 
                       selector:@selector(yourMethodHere) 
                       userInfo:nil 
                        repeats:NO]; 
}

请务必在 .h 和 .m 文件中声明并@synthesize 您的计时器。

希望能帮助到你。

于 2012-09-11T01:29:47.287 回答
2

UITextField 或 UITextView 有一个委托方法来检测用户何时键入内容:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
   // user tapped a key
   //
   // reset your "idle" time variable to say user has interacted with your app
}

请记住遵守 UITextField 或 UITextView 协议,具体取决于您使用的协议(如果您同时拥有文本字段和文本视图,则可能两者兼有)。还要记住将每个文本字段或文本视图的委托标记为视图控制器。

<UITextFieldDelegate,UITextViewDelegate>

更新的答案

罗恩,不确定你是否真的用谷歌搜索过,但我发现了这个:

iPhone:检测自上次屏幕触摸以来的用户不活动/空闲时间

于 2012-09-11T01:32:29.857 回答