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

标签 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];
}

所有延迟事件的东西都不会在最后触发。我沮丧地站在黑屏中,因为应用程序甚至无法启动。

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

最佳答案

首先,我认为延迟设备事件不是一个好主意。我会尝试以某种方式解决它。另外,我不确定 Apple 是否会批准延迟事件。

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

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

我从来没有延迟过本地事件,但我之前确实处理过一些事件操作。我记得那时候,重写 sendEvent: 就足以满足我的要求了。

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

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

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

我尝试调用 dispatch_after(3) 但它没有用。

如果您只想延迟某些事件类型,请使用 UIEventtypesubtype 属性。看看 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/

相关文章:

iphone - 未显式调用 Objective-C 版本

ios - 如何防止 UIWindow 成为关键窗口?

ios - UIWindow 的目的是什么?

iphone - iOS5:如何在UIStoryboard中设置UIWindow子类?

iOS:使用 JSON 的 Twitter URL 路径?

ios - 是否可以将 iOS 模拟器更改为使用 24 小时制?

ios - 一秒钟后 UIButton 退出突出显示模式

ios - 管理数组 - 发送到不可变对象(immutable对象)的变异方法

objective-c - 如何覆盖点到像素 iOS 特异性并以正确的尺寸绘制图像?

ios - UITableView 行动画持续时间和完成回调