iOS 8 方向变化检测

Posted

技术标签:

【中文标题】iOS 8 方向变化检测【英文标题】:iOS 8 Orientation Change Detection 【发布时间】:2014-10-11 13:10:20 【问题描述】:

ios 8 上运行,我需要在旋转我的应用时更改 UI。

目前我正在使用此代码:

-(BOOL)shouldAutorotate

    UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];
    if (orientation != UIInterfaceOrientationUnknown) [self resetTabBar];

    return YES;

我所做的是删除当前 UI 并添加一个适合方向的新 UI。但是,我的问题是每次进行一次旋转时都会调用此方法大约 4 次。

在 iOS 8 中更改方向的正确方法是什么?

【问题讨论】:

你为什么要用这种方法来改变界面呢?我认为它应该只是回答是否轮换的问题。对 iOS 7 使用“willRotateToInterfaceOrientation:duration:”,对 iOS 8 使用“viewWillTransitionToSize:withTransitionCoordinator:”。 刚问了一个问题,人们试图提供帮助,但没有费心接受答案或评论任何细节。抱歉,这不太好。 【参考方案1】:

Timur Kuchkarov 是正确的,但我会发布答案,因为我第一次查看此页面时错过了他的评论。

iOS 8检测方向变化(旋转)的方法是实现视图控制器的以下方法:

- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator

    // Do view manipulation here.
    [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];

注意:此时控制器的视图尚未转换到该尺寸,因此如果您的尺寸调整代码依赖于视图的当前尺寸,请小心。

【讨论】:

另外,我刚刚注意到有关如何在this answer 中使用coordinator 的更多详细信息。 既然这个方法是在视图还没有过渡到新尺寸的时候调用的,那么在视图过渡到新尺寸之后调用什么方法呢? 您应该指出,此方法不会在每次轮换更改时触发。它仅在特定的轮换情况下触发。我在我的代码中使用这种方法,根据显示的界面,有时它会触发,有时它不会触发,这就是为什么我还必须包含 viewWillLayoutSubviews 来处理所有情况。【参考方案2】:

viewWillTransitionToSize:withTransitionCoordinator: 方法在视图转换到新大小之前立即调用,正如 Nick 指出的那样。但是,在视图转换到新大小后立即运行代码的最佳方法是在 中使用方法中的完成块:

- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator 
    [coordinator animateAlongsideTransition:nil completion:^(id<UIViewControllerTransitionCoordinatorContext> context) 
        // your code here
    ];

感谢 this answer 提供代码并感谢 Nick 在评论中链接到它。

【讨论】:

如何判断翻译是否完成? @Satyam 由注释// your code here 表示的完成块将在转换完成后立即运行。 您应该指出,此方法不会在每次轮换更改时触发。它仅在特定的轮换情况下触发。我在我的代码中使用这种方法,根据显示的界面,有时它会触发,有时它不会触发,这就是为什么我还必须包含 viewWillLayoutSubviews 来处理所有情况。

以上是关于iOS 8 方向变化检测的主要内容,如果未能解决你的问题,请参考以下文章

iOS - 如何在应用程序处于后台时检测网络变化

检测屏幕方向变化(快速)

如何检测 Flutter 中布局的方向变化?

UIScrollView - 检测layoutSubviews中的滚动与方向变化?

在 Symbian/Qt 中检测手机方向变化的问题

给定触摸点列表,如何检测摇晃手势?