当应用程序进入后台或从iOS 9开始处于非活动状态时,似乎会多次调用方法viewWillTransitionToSize:withTransitionCoordinator:
。
例如,如果应用程序位于iPad上的纵向,则按主页按钮将使应用程序首先接收方法调用,大小为1024x768(横向),然后是768x1024(回到纵向)。这让我得出结论,iOS为了获得应用切换器的屏幕截图而这样做。
我们的应用程序逻辑取决于屏幕大小和屏幕大小的更改触发任务,这些任务会根据新大小更新我们的模型。我们需要在用户旋转设备或进入多任务模式(拆分视图)时执行此操作,但是当用户进入后台时我们不能这样做。
一个想法是使用 UIApplicationWillResignActiveNotification 通知,但事实证明这是不可能完成的任务,因为在发送通知之前有时会调用viewWillTransitionToSize:withTransitionCoordinator:
,而在发送通知之后会调用它。 :/
有什么想法吗?
答案 0 :(得分:3)
在viewWillTransitionToSize:withTransitionCoordinator
中,您可以使用UIViewControllerTransitionCoordinator来判断转换何时完成。然后,检查您的应用是否未落后并执行逻辑。
- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator {
[coordinator animateAlongsideTransition:nil completion:^(id<UIViewControllerTransitionCoordinatorContext> _Nonnull context) {
// after transition
if ([UIApplication sharedApplication].applicationState != UIApplicationStateBackground) {
// perform logic
}
}];
}
答案 1 :(得分:1)
我目前遇到同样的问题。当尺寸发生变化时,我会做很多工作,并且在进入后台时不会发生这种情况。 “大部分”时间对我有用的一件事是使用[uiapplication sharedApplication] applicationState]检查应用程序是否在后台。在对viewWillTransitionToSize进行2次额外调用之前,应用程序状态设置为UIApplicationStateBackground。这似乎是一致的。当使用多任务处理应用程序时,我遇到了一些问题,然后进入后台,然后以全尺寸再次前景。在这种情况下,调用的顺序似乎不一致,以确定应该使用哪些大小更改。
答案 2 :(得分:0)
transitionDuration()
,而不是使用0.1秒。然后,检查背景状态。