答案 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]
调用可以完全满足您的需求。