我想创建一个自定义 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];
}
所有延迟事件的东西都不会在最后触发。我沮丧地站在黑屏中,因为应用程序甚至无法启动。
编辑:我找到了解决这个问题的方法。然而,直到今天,还没有正式的合理和安全的方法来做到这一点,但我想这根本不重要。
最佳答案
首先,我认为延迟设备事件不是一个好主意。我会尝试以某种方式解决它。另外,我不确定 Apple 是否会批准延迟事件。
我不试图延迟事件的另一个原因是因为我不是大师。我不知道该应用程序将如何开始运行。
也就是说,正如 SomeGuy 所建议的那样,您可以子类化 UIApplication 并覆盖与您的应用程序相关的所有事件处理方法。看看 UIApplication class's reference .
我从来没有延迟过本地事件,但我之前确实处理过一些事件操作。我记得那时候,重写 sendEvent:
就足以满足我的要求了。
您可以按如下方式覆盖 sendEvent:
:
- (void)sendEvent:(UIEvent *)event
{
[NSThread sleepForTimeInterval:.2];
[super sendEvent:event];
}
这将延迟所有 事件 200 毫秒。但是,这会阻塞您的主线程。
我尝试调用 dispatch_after(3)
但它没有用。
如果您只想延迟某些事件类型,请使用 UIEvent
的 type
和 subtype
属性。看看 UIEvent class's reference .
同样,我从来没有延迟过,我也不知道你到底想完成什么,但我建议找到一个替代方法来延迟设备的事件。
此外,不要忘记您必须告诉 Cocoa Touch 使用您的自定义 UIApplication。转到 main.m
文件并将主体类名添加到 UIApplicationMain
调用:
int main(int argc, char *argv[])
{
@autoreleasepool {
return UIApplicationMain(argc, argv, NSStringFromClass([YourApplication class]), NSStringFromClass([YourAppDelegate class]));
}
}
作为引用,这是我重写的方法:
- (void)sendEvent:(UIEvent *)event
{
[super sendEvent:event];
// Was it a touch?
if (event.type == UIEventTypeTouches) {
// Get touch phase.
NSSet *allTouches = [event allTouches];
UITouchPhase phase = [((UITouch *)[allTouches anyObject]) phase];
// Check what to do.
switch (phase) {
case UITouchPhaseBegan:
// Reset counter.
[self.counter resetCount];
break;
case UITouchPhaseEnded:
case UITouchPhaseCancelled:
// Start counter.
[self.counter startCount];
break;
default:
break;
}
}
}
这用于在一段时间不活动后自动将用户从应用程序中注销(这是一个信息亭应用程序)。
不幸的是,这是我能做的最好的。也许有更多经验的人可以提供他们的意见。
希望对您有所帮助。
关于ios - 如何创建一个将所有事件延迟 200 毫秒的 UIWindow?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23872956/