如何创建一个将所有事件延迟200毫秒的UIWindow?

时间:2014-05-26 15:00:44

标签: ios objective-c uiwindow

我想创建一个自定义UIWindow类,它将所有事件延迟200毫秒。 可能吗?如果是,怎么样?

好的,我创建了一个自定义的UIApplication类,一切正常:

- (void)sendEvent:(UIEvent *)event
{
    [super sendEvent:event]; NSLog(@"Viola!");
}

但是,一旦我添加了这些额外的代码,以使其延迟事件,它就不会发送任何事件。

- (void)sendEvent:(UIEvent *)event
{
    [self performSelector:@selector(handleEventsAfterDelay:) withObject:event afterDelay:0.500];
}

- (void)handleEventsAfterDelay:(UIEvent *)event
{
    [super sendEvent:event]; NSLog(@"Viola!");
}

此外,这不起作用:

-(void)sendEvent:(UIEvent *)event
{
    [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:.2]];

    [super sendEvent:event];
}

延迟事件的一切都不会在最后发生。我沮丧地盯着空白的黑屏,因为应用程序甚至无法启动。

编辑:我找到了解决此问题的方法。然而,直到今天,没有正式合理且安全的方式来做到这一点,但我想这根本不重要。

2 个答案:

答案 0 :(得分:1)

首先,我认为延迟设备事件是一个好主意。我会尝试解决一些方法。此外,我不确定Apple是否会推迟延迟活动。

我不想试图延迟事件的另一个原因是因为我不是大师。我不知道该应用程序将如何开始表现。

也就是说,正如SomeGuy建议的那样,您可以继承UIApplication并覆盖与您的应用相关的所有事件处理方法。看看UIApplication class's reference

我从未推迟过原生事件,但我确实在事先处理了一些事件。我记得那时候,覆盖sendEvent:已经足够我正在做的事情。

您可以按如下方式覆盖sendEvent:

- (void)sendEvent:(UIEvent *)event
{
    [NSThread sleepForTimeInterval:.2];
    [super sendEvent:event];
}

这会将所有事件延迟200毫秒。但是这会阻止你的主线程。

我尝试使用dispatch_after(3)来电,但它没有用。

如果您只想延迟某些事件类型,请使用UIEvent的{​​{1}}和type属性。看看UIEvent class's reference

同样,我从来没有拖延,也不知道你正在努力完成什么,但我建议找一个延迟设备事件的替代方案。

另外,不要忘记你必须告诉Cocoa Touch使用你的自定义UIApplication。转到subtype文件并向main.m调用添加主要类名:

UIApplicationMain

作为参考,这是我的重写方法:

int main(int argc, char *argv[])
{
    @autoreleasepool {
        return UIApplicationMain(argc, argv, NSStringFromClass([YourApplication class]), NSStringFromClass([YourAppDelegate class]));
    }
}

这用于在一些非活动时间后从应用程序自动注销用户(这是一个自助服务终端应用程序)。

不幸的是,这是我能做的最好的事情。也许有经验的人可以提供他们的意见。

我希望这有帮助。

答案 1 :(得分:0)

我认为您遇到的问题是由UIEvent时间戳引起的。我想如果事件在短时间内没有发送,事件就会过期。

您可以尝试按类别添加setTimestamp:并相应地进行修改,但更改必须非常准确。