ViewController方向更改未设置动画

时间:2015-09-17 14:07:26

标签: ios uiviewcontroller swift2 ios9 transitions

当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

我需要做些什么才能为转换更改设置动画?

感谢您的帮助!

2 个答案:

答案 0 :(得分:3)

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

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

Apple UIApplicationDelegate的{​​{1}}窗口属性显示:

  

&#34; ...您必须实现此属性的getter方法并使用它   创建并返回自定义窗口。&#34;

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

<强>目标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 { }
}

答案 1 :(得分:2)

看看你的应用程序:didFinishLaunchingWithOptions:handler。看来,如果手动创建应用程序的UIWindow对象,则会触发iOS9轮换问题。

我不确定确切原因,但在我们的应用程序中,我们能够通过删除操纵UIWindow的代码来解决问题,而是让故事板系统初始化它。