【发布时间】:2011-11-18 15:01:57
【问题描述】:
我想以编程方式检测 ipad 上的旋转过程。在这种情况下,我想在旋转开始时将布尔值设置为是,并在旋转结束后将其设置为假。是否有任何方法可以在旋转开始和旋转结束时调用?
【问题讨论】:
我想以编程方式检测 ipad 上的旋转过程。在这种情况下,我想在旋转开始时将布尔值设置为是,并在旋转结束后将其设置为假。是否有任何方法可以在旋转开始和旋转结束时调用?
【问题讨论】:
来自 Apple 文档:
在用户界面开始旋转之前发送到视图控制器。
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
用户界面旋转后发送到视图控制器:
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
在此处查看更多信息:UIViewController Class Reference -> Responding to View Rotation Events
注意: 这已弃用,请参阅this post
【讨论】:
对于这篇文章的新手,Nekto 建议的方法在 iOS 8 中已被弃用。Apple 建议使用:
-(void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
您可以使用“大小”参数作为一种简单的方法来确定它是转换为纵向还是横向。
即
if (size.width > size.height)
{
// Position elements for Landscape
}
else
{
// Position elements for Portrait
}
更多信息请访问Docs。
【讨论】:
上述所有方法(在@Nekto 的回答中)在iOS8.0 及更高版本中已弃用。来源:iOS Developer Library
从 iOS 8 开始,所有与旋转相关的方法都已弃用。反而, 旋转被视为视图控制器大小的变化 视图,因此使用报告 viewWillTransitionToSize:withTransitionCoordinator: 方法。当。。。的时候 界面方向改变,UIKit 在窗口的 根视图控制器。该视图控制器然后通知它的孩子 视图控制器,在整个视图中传播消息 控制器层次结构。
在 iOS8 或更高版本中,您可以使用以下方法。
- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id <UIViewControllerTransitionCoordinator>)coordinator
{
[super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
[coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context) {
// Stuff you used to do in willRotateToInterfaceOrientation would go here.
// If you don't need anything special, you can set this block to nil.
} completion:^(id<UIViewControllerTransitionCoordinatorContext> context) {
// Stuff you used to do in didRotateFromInterfaceOrientation would go here.
// If not needed, set to nil.
}];
}
【讨论】:
SWIFT 5:
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
super.viewWillTransition(to: size, with: coordinator)
coordinator.animate(alongsideTransition: { _ in
// code at start of rotation
}) { _ in
// code at end of rotation
}
}
【讨论】:
在UISplitViewController协议中,iOS8的新方法是
- (void)splitViewController:(UISplitViewController *)svc willChangeToDisplayMode:(UISplitViewControllerDisplayMode)displayMode
有四种显示模式:
typedef enum UISplitViewControllerDisplayMode : NSInteger {
UISplitViewControllerDisplayModeAutomatic,
UISplitViewControllerDisplayModePrimaryHidden,
UISplitViewControllerDisplayModeAllVisible,
UISplitViewControllerDisplayModePrimaryOverlay,
} UISplitViewControllerDisplayMode;
但是此方法将从不返回自动。
【讨论】: