当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
。
我需要做些什么才能为转换更改设置动画?
感谢您的帮助!
答案 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的代码来解决问题,而是让故事板系统初始化它。