iOS进入后台时获取视图快照的确切时刻?

时间:2011-10-29 09:20:46

标签: objective-c cocoa-touch delegates multitasking snapshot

5 个答案:

答案 0 :(得分:21)

此方法返回后立即截取屏幕截图。我猜你的-resetAnimation方法在下一个runloop循环中完成而不是立即完成。 我没试过这个,但你可以尝试让runloop运行然后稍后返回:

- (void) applicationDidEnterBackground:(UIApplication *)application {
    // YOUR CODE HERE

    // Let the runloop run for a brief moment
    [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.01]];
}

我希望这有帮助, 费边


更新:-auseAnimation和-resetAnimation区别

方法:延迟-applicationWillResignActive中发生的动画:并在-applicationDidEnterBackground中取消延迟动画:

- (void) applicationWillResignActive:(UIApplication *)application {
    // Measure the time between -applicationWillResignActive: and -applicationDidEnterBackground first!
    [self performSelector:@selector(pauseAnimation) withObject:nil afterDelay:0.1];

    // OTHER CODE HERE
}

- (void) applicationDidEnterBackground:(UIApplication *)application {
    [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(pauseAnimation) object:nil];

    // OTHER CODE HERE
}

答案 1 :(得分:2)

由于@Fabian Kreiser,我现在已经进行了一些测试并消除了这个问题。

总结:Kreiser说得对:在方法applicationDidEnterBackground:之后,iOS会立即截取截屏:在当前runloop 结束之前立即返回 - 。< / p>

这意味着,如果您在离开前想要完成的didEnterBackground方法中启动任何计划任务,则必须让当前的runloop运行,只要任务可能需要运行光洁度。

在我的情况下,计划的任务是一个UIAnimateWithDuration方法调用 - 我让自己感到困惑的是它的延迟和持续时间都是0 - 尽管如此,调用仍计划在另一个线程中运行,因此不是'能够在applicationDidEnterBackground方法结束之前完成。结果:屏幕截图确实在显示器更新到我想要的状态之前拍摄 - 并且,当重新启动时,此屏幕截图在屏幕上短暂闪烁,导致不必要的闪烁。

此外,为了提供在我的问题中解释的“平滑”与“即时”转换行为,Kreiser建议延迟applicationWillResignActive中的“平滑”转换调用:并取消applicationDidEnterBackground中的调用:工作正常。我注意到两种代表方法之间的延迟在我的情况下大约是0.005-0.019秒,所以我申请了一个宽裕的边缘并使用了0.05秒的延迟。

我的赏金,正确答案,我要感谢Fabian。希望这也有助于处于类似情况的其他人。

答案 2 :(得分:2)

runloop解决方案实际上会导致应用程序出现一些问题。

[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.01]];

如果您转到后台并立即再次打开应用程序,该应用程序将变为黑屏。当您第二次重新打开应用程序时,一切都恢复正常。

更好的方法是使用

[CATransaction flush]

这会强制立即应用所有当前事务,并且不会出现导致黑屏的问题。

答案 3 :(得分:1)

根据您对此过渡顺利运行的重要性,您可以完全用你的应用程序杀死多任务w UIApplicationExitsOnSuspend.然后,你可以保证你的Default.png和干净视觉状态。

当然,您必须在退出/启动时保存/恢复状态,如果没有关于应用程序性质的更多信息,很难说这是否值得这么麻烦。

答案 4 :(得分:0)

在iOS 7中,[[UIApplication sharedApplication] ignoreSnapshotOnNextApplicationLaunch]调用可以完全满足您的需求。