ViewController 方向变化没有动画

Posted

技术标签:

【中文标题】ViewController 方向变化没有动画【英文标题】:ViewController orientation change isn't animated 【发布时间】:2015-09-17 14:07:26 【问题描述】:

当 iPhone 将其方向从纵向更改为横向时,我正在尝试调整一些视图,反之亦然。在 ios8 上一切正常,但不幸的是,这些变化不是动画的,而是在 iOS9 上立即发生的。这是我在模态UIViewController 中通过自定义转换呈现的代码:

override func shouldAutorotate() -> Bool 
    return true


override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask 
    return UIInterfaceOrientationMask.AllButUpsideDown


override func preferredInterfaceOrientationForPresentation() -> UIInterfaceOrientation 
    return .Portrait


override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) 
    super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)

    let changeToPortrait = size.width < size.height
    coordinator.animateAlongsideTransition( (context) -> Void in
        //show portrait
        if changeToPortrait 
            //do view changes...
        

        //show landscape
        else 
            //undo view changes...
        
    )  (context) -> Void in
        print("done")
    

如果我打印coordinator.isAnimated(),它会显示false,因此coordinator.transitionDuration() 也是0.0

我必须做些什么来制作过渡变化的动画?

感谢您的帮助!

【问题讨论】:

【参考方案1】:

此行为可能是因为您在 application:didFinishLaunchingWithOptions: 方法内将自定义 UIWindow 子类设置为 AppDelegate 的 window 属性,正如另一个答案中提到的端粒。

如果您需要在 iOS 9 中使用 UIWindow 子类,请为 AppDelegate 的 window 属性实现自定义 getter 以维护方向更改动画。

Apple 的 documentation 用于 UIApplicationDelegate 的 window 属性说:

"...你必须实现这个属性的getter方法并使用它 创建并返回您的自定义窗口。”

通常的做法是直接在application:didFinishLaunchingWithOptions:中设置window属性。相反,在您的 AppDeleate 中,像这样实现自定义 getter(感谢 Tomas Camin 提供代码,找到 here):

Objective-C

- (MyCustomWindow *)window
    
    static MyCustomWindow *customWindow = nil;
    if (!customWindow) customWindow = [[MyCustomWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    return customWindow;

斯威夫特

var customWindow: MyCustomWindow?    
var window: UIWindow? 
    get 
        customWindow = customWindow ?? MyCustomWindow(frame: UIScreen.mainScreen().bounds)
        return customWindow
    
    set  

【讨论】:

甚至不需要与 UIWindow 子类。由于 GCKUICastContainerViewController,我手动创建了一个 UIWindow 实例并且遇到了这个问题。 Swift 解决方案对我有用。【参考方案2】:

查看您的应用程序:didFinishLaunchingWithOptions: 处理程序。如果您手动创建应用程序的 UIWindow 对象,这似乎会触发 iOS9 旋转问题。

我不确定确切的原因,但在我们的应用程序中,我们能够通过删除操纵 UIWindow 的代码并让情节提要系统对其进行初始化来解决此问题。

【讨论】:

以上是关于ViewController 方向变化没有动画的主要内容,如果未能解决你的问题,请参考以下文章

iPad - 方向变化和视图?

根据方向变化改变 CGRect 值

iPhone 多子视图动画

Swift导航栏中图像的动画变化

UIPageViewController - 到下一个视图控制器的动画过渡与方向变化混合

缺少 iOS Swift 方向更改动画