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 方向变化检测的主要内容,如果未能解决你的问题,请参考以下文章