【问题标题】:viewWillTransitionToSize:withTransitionCoordinator: called when app goes into the background or inactiveviewWillTransitionToSize:withTransitionCoordinator: 当应用进入后台或不活动时调用
【发布时间】:2016-01-04 19:16:57
【问题描述】:

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

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

我们的应用程序逻辑取决于屏幕尺寸,并且屏幕尺寸的变化会触发任务,这些任务会根据新尺寸更新我们的模型。当用户旋转设备或进入多任务模式(拆分视图)时我们需要这样做,但当用户进入后台时我们不能这样做。

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

有什么想法吗?

【问题讨论】:

    标签: ios cocoa-touch uikit ios9


    【解决方案1】:

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

    【讨论】:

    • 按电源键多次返回activeState。
    【解决方案2】:

    我目前有同样的问题。当尺寸发生变化时我会做很多工作,并且在进入后台时不会发生这种情况。 “大部分”时间对我有用的一件事是使用 [uiapplication sharedApplication] applicationState] 检查应用程序是否在后台。在对 viewWillTransitionToSize 进行 2 次额外调用之前,应用程序状态设置为 UIApplicationStateBackground。这似乎是一致的。当应用程序使用多任务处理然后进入后台然后再次以全尺寸进入前台时,我遇到了一些问题。在这种情况下,调用顺序似乎不一致,无法确定应该使用哪些大小更改。

    【讨论】:

    • 我目前的解决方法是将 viewWillTransitionToSize 中的逻辑推迟 0.1 秒,并检查 UIApplication.sharedApplication().applicationState 是否仍然处于活动状态。这是一个丑陋的黑客,但我认为没有其他办法。
    【解决方案3】:

    是的,同样的问题。您可以使用协调器的transitionDuration(),而不是使用 0.1 秒。然后,检查后台状态。

    【讨论】:

    • 如果您对动画完成之前的状态感兴趣,那很遗憾……
    猜你喜欢
    • 1970-01-01
    • 2016-12-18
    • 1970-01-01
    • 2019-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多