viewWillTransitionToSize:withTransitionCoordinator:当app进入后台或处于非活动状态时调用

时间:2015-10-07 13:58:45

标签: ios cocoa-touch uikit ios9

当应用程序进入后台或从iOS 9开始处于非活动状态时,似乎会多次调用方法viewWillTransitionToSize:withTransitionCoordinator:

例如,如果应用程序位于iPad上的纵向,则按主页按钮将使应用程序首先接收方法调用,大小为1024x768(横向),然后是768x1024(回到纵向)。这让我得出结论,iOS为了获得应用切换器的屏幕截图而这样做。

我们的应用程序逻辑取决于屏幕大小和屏幕大小的更改触发任务,这些任务会根据新大小更新我们的模型。我们需要在用户旋转设备或进入多任务模式(拆分视图)时执行此操作,但是当用户进入后台时我们不能这样做。

一个想法是使用 UIApplicationWillResignActiveNotification 通知,但事实证明这是不可能完成的任务,因为在发送通知之前有时会调用viewWillTransitionToSize:withTransitionCoordinator:,而在发送通知之后会调用它。 :/

有什么想法吗?

3 个答案:

答案 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秒。然后,检查背景状态。