我想创建一个自定义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];
}
延迟事件的一切都不会在最后发生。我沮丧地盯着空白的黑屏,因为应用程序甚至无法启动。
编辑:我找到了解决此问题的方法。然而,直到今天,没有正式合理且安全的方式来做到这一点,但我想这根本不重要。
答案 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:
并相应地进行修改,但更改必须非常准确。