当我们开始旋转设备并完成后会调用啥方法
Posted
技术标签:
【中文标题】当我们开始旋转设备并完成后会调用啥方法【英文标题】:what method will called when we start to rotate device and after it finished当我们开始旋转设备并完成后会调用什么方法 【发布时间】:2011-11-18 15:01:57 【问题描述】:我想以编程方式检测 ipad 上的旋转过程。在这种情况下,我想在旋转开始时将布尔值设置为是,并在旋转结束后将其设置为假。是否有任何方法可以在旋转开始和旋转结束时调用?
【问题讨论】:
【参考方案1】:来自 Apple 文档:
在用户界面开始旋转之前发送到视图控制器。
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
用户界面旋转后发送到视图控制器:
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
在此处查看更多信息:UIViewController Class Reference -> Responding to View Rotation Events
注意: 这已弃用,请参阅this post
【讨论】:
现在已弃用 willRotate 在 ios 9 (Xamarin) 中为我工作。但是,请查看@wyzkid207 帖子并使用 viewWillTransitionToSize【参考方案2】:对于这篇文章的新手,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。
【讨论】:
如果控制器的视图在任一布局中具有固定的宽度/高度,则大小将毫无用处。 这是真的。我只是在举一个简单而肮脏的例子。 使用 UIInterfaceOrientation destinationOrientation = [[UIApplication sharedApplication] statusBarOrientation];【参考方案3】:上述所有方法(在@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.
];
【讨论】:
这是一个很好的答案:) 我要保存这个 这个答案是最好的【参考方案4】: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
【讨论】:
【参考方案5】:在UISplitViewController协议中,iOS8的新方法是
- (void)splitViewController:(UISplitViewController *)svc willChangeToDisplayMode:(UISplitViewControllerDisplayMode)displayMode
有四种显示模式:
typedef enum UISplitViewControllerDisplayMode : NSInteger
UISplitViewControllerDisplayModeAutomatic,
UISplitViewControllerDisplayModePrimaryHidden,
UISplitViewControllerDisplayModeAllVisible,
UISplitViewControllerDisplayModePrimaryOverlay,
UISplitViewControllerDisplayMode;
但是此方法将从不返回自动。
【讨论】:
以上是关于当我们开始旋转设备并完成后会调用啥方法的主要内容,如果未能解决你的问题,请参考以下文章
UIApplication DidBecomeActiveNotification 被触发后会调用啥?
在 iOS5 中未调用 UIViewController 设备旋转委托方法
MPI_Isend/MPI_Irecv 在啥条件下等待其关联的完成调用 (MPI_Wait/MPI_Test) 开始数据传输?