当我们开始旋转设备并完成后会调用啥方法

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 被触发后会调用啥?

amr文件用啥打开

UIViewController动画等到动画完成

在 iOS5 中未调用 UIViewController 设备旋转委托方法

MPI_Isend/MPI_Irecv 在啥条件下等待其关联的完成调用 (MPI_Wait/MPI_Test) 开始数据传输?