【问题标题】:Callback when interface rotation ENDED in iOS 9?iOS 9 中界面旋转结束时的回调?
【发布时间】:2023-07-25 21:57:01
【问题描述】:

我还没有看到这个问题的明确答案,围绕 iOS 8 的变化有很多噪音,但我想为 iOS 9 解决这个问题:

界面方向更改结束后获取回调的正确方法是什么?

从 iOS 9 开始,didRotateFromInterfaceOrientation: 已被弃用,官方文档告诉我们改用viewWillTransitionToSize:withTransitionCoordinator。这为我们(通过transitionCoordinator)提供了一种在过渡旁边制作动画的方法,以及一个完成块,但没有直接回调真正的过渡“结束”。

transitionCoordinator 中的另一种方法是 notifyWhenInteractionEndsUsingBlock:,但这似乎报告了过渡的交互部分的结束,而不是整个事件。

那么,“官方”的做法是实现animateAlongsideTransition:completion,而干脆忽略动画选项吗?

我知道我们仍然可以使用旧的 didRotateFromInterfaceOrientation:,但在可能的情况下进行现代化总是更好。

【问题讨论】:

    标签: uiview uiviewcontroller ios9 uiinterfaceorientation transitions


    【解决方案1】:

    是的,您可以忽略动画选项,只需使用 'nil' 即可。

    来自 WWDC 2014 'View Controller Advancements in iOS 8' 的示例:

    - (void) viewWillTransitionToSize:(CGSize)s withTransitionCoordinator:(UIVCTC)t
    {
        orientation = [self orientationFromTransform: [t targetTransform]];
        oldOrientation = [[UIApplication sharedApplication] statusBarOrientation];
    
        [self myWillRotateToInterfaceOrientation:orientation duration:duration];
    
        [t animateAlongsideTransition:^(id <UIVCTCContext>) {
            [self myWillAnimateRotationToInterfaceOrientation:orientation duration:duration];
        } 
        completion: ^(id <UIVCTCContext>) {
            [self myDidAnimateFromInterfaceOrientation:oldOrientation];
        }];
    }
    

    适用于 iOS 9。

    【讨论】: