iOS 8方向变化检测

18

我的应用程序运行在iOS 8上,当旋转应用程序时,我需要更改UI。

目前,我正在使用以下代码:

-(BOOL)shouldAutorotate
{
    UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];
    if (orientation != UIInterfaceOrientationUnknown) [self resetTabBar];

    return YES;
}

我的做法是移除当前的用户界面并添加一个适合方向的新界面。但是,我的问题是每次进行一次旋转时,这种方法都会被调用约4次。

在iOS 8中,如何正确地在屏幕方向改变时进行更改?


6
你为什么要用这种方法改变界面呢?我认为它只是应该回答是否旋转的问题。对于iOS7及以下版本,请使用“willRotateToInterfaceOrientation:duration:”,对于iOS8,请使用“viewWillTransitionToSize:withTransitionCoordinator:”。 - Timur Kuchkarov
刚刚问了一个问题,有人试图帮助但没有接受答案或评论任何细节。抱歉,但这不好。 - bisma
2个回答

26

尽管 Timur Kuchkarov 回答正确,但因为我第一次检查此页面时未看到他的评论,所以我会发布答案。

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

- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
{
    // Do view manipulation here.
    [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
}

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


另外,我刚刚注意到如何在这个答案中更好地使用coordinator的细节。 - Nick Merrill
4
当视图还没有转换到新的大小时调用此方法,那么在视图转换到新的大小后会调用哪个方法? - VinceFior
1
你应该指出这个方法并不会每次都在旋转变化时触发。它只在旋转的特定情况下触发。我在我的代码中使用了这种方法,根据显示的界面不同,有时会触发,有时不会触发,这就是为什么我还必须包含viewWillLayoutSubviews来处理所有情况。 - Logicsaurus Rex

20

如Nick所指出的,viewWillTransitionToSize:withTransitionCoordinator:方法在视图转换到新大小之前立即调用。然而,最好的方法是在该方法中使用完成块来立即运行代码,以确保在视图转换到新大小之后。

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

感谢这个答案提供的代码,以及Nick在评论中的链接。


如何确定翻译是否已完成? - Satyam
@Satyam 由注释// your code here表示的完成块将在转换完成后立即运行。 - VinceFior
你应该指出这个方法并不会在每次旋转变化时都触发。它只在旋转的特定情况下触发。我在我的代码中使用了这个方法,根据显示的界面不同,有时它会触发,有时不会,这就是为什么我还必须包括viewWillLayoutSubviews来处理所有情况的原因。 - Logicsaurus Rex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接