【发布时间】:2013-01-16 22:41:08
【问题描述】:
我正在制作一个 iOS 应用程序,它需要在旋转时进行一些界面重新排列。我试图通过实现- (void)orientationChanged:(NSNotification *)note 来检测这一点,但这会通知我设备何时朝上或朝下。
我想要一种在界面改变方向时得到通知的方法。
【问题讨论】:
标签: ios interface nsnotificationcenter screen-rotation autorotate
我正在制作一个 iOS 应用程序,它需要在旋转时进行一些界面重新排列。我试图通过实现- (void)orientationChanged:(NSNotification *)note 来检测这一点,但这会通知我设备何时朝上或朝下。
我想要一种在界面改变方向时得到通知的方法。
【问题讨论】:
标签: ios interface nsnotificationcenter screen-rotation autorotate
有几种方法可以做到这一点,你可以在UIViewController class reference找到它们:
– willRotateToInterfaceOrientation:duration:
– willAnimateRotationToInterfaceOrientation:duration:
– didRotateFromInterfaceOrientation:
您也可以在 viewWillLayoutSubviews 方法中执行此操作,但要小心,因为它也会在屏幕外观上调用,并且在您添加子视图时调用。
编辑:
解决方案现已弃用,请参阅已接受的答案。
【讨论】:
自 iOS 8 起,上述方法已被弃用,处理和检测设备旋转的正确方法是:
-(void) viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id )coordinator;
要检测设备方向,您应该(根据文档):调用statusBarOrientation 方法来确定设备方向
【讨论】:
从 iOS 8 开始,这是正确的做法。
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
super.viewWillTransition(to: size, with: coordinator)
coordinator.animate(alongsideTransition: { context in
// This is called during the animation
}, completion: { context in
// This is called after the rotation is finished. Equal to deprecated `didRotate`
})
}
【讨论】:
斯威夫特 3:
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
}
【讨论】: