iOS 7 未调用supportedInterfaceOrientations
Posted
技术标签:
【中文标题】iOS 7 未调用supportedInterfaceOrientations【英文标题】:supportedInterfaceOrientations not called with iOS 7 【发布时间】:2014-01-13 10:26:49 【问题描述】:我搜索了这个问题的答案,但找不到任何解决我问题的方法。
所以问题来了:
我有一个自定义 UINavigationController,在创建它时在 rootViewController 上调用 supportedInterfaceOrientations
方法(仅支持纵向)。
但是当将另一个 ViewController 推入堆栈时,不会在推入的 ViewController 上调用此方法(支持除了倒置之外的所有内容)。
我通过在viewDidLoad
-方法中调用[self supportedInterfaceOrientations]
解决了这个问题,但我认为这不是解决问题的好方法。
我希望你能在这件事上帮助我。
这是我在第二个 viewController 中实现的代码。
- (BOOL)shouldAutorotate
return YES;
- (NSUInteger)supportedInterfaceOrientations
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
[[[UIApplication sharedApplication] delegate] setGlobalOrientationMask:UIInterfaceOrientationMaskAllButUpsideDown];
return UIInterfaceOrientationMaskAllButUpsideDown;
else
[[[UIApplication sharedApplication] delegate] setGlobalOrientationMask:UIInterfaceOrientationMaskAll];
return UIInterfaceOrientationMaskAll;
我认为 johnMa 的解决方案应该适用于大多数应用程序,但在我的情况下,我认为有一个特殊问题,但我现在自己解决了它(不确定它是否是一个好的解决方案,但它有效)。
我在我的 navigationController-delegate 上实现了 - (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
方法。
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
if (DEF_SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7"))
if ([viewController respondsToSelector:@selector(supportedInterfaceOrientations)])
[viewController supportedInterfaceOrientations];
我希望这可以帮助其他有同样问题的人。
【问题讨论】:
【参考方案1】:您应该在自定义 NavigationController 中实现这些代码。
- (NSUInteger)supportedInterfaceOrientations
if ([self.topViewController isMemberOfClass:[RootViewController class]])
return UIInterfaceOrientationMaskPortrait;
else
return UIInterfaceOrientationMaskAllButUpsideDown;
因为当您的设备旋转时,它会首先询问您的应用 rootController(Custom NavigationController),如果 supportedInterfaceOrientations
没有在那里实现。然后它会向 rootController 询问supportedInterfaceOrientations
。
充当主窗口的根视图控制器或在主窗口上全屏显示的视图控制器可以声明它支持的方向。View Controller Programming Guide
【讨论】:
这有帮助,但是现在从纵向旋转到横向时会出现一个问题,第一次旋转在我的导航控制器上调用supportedInterfaceOrientations,但是旋转没有完成,只有在第二次旋转到横向旋转正确完成 第一次/第二次的问题你找到解决办法了吗?我也有同样的问题【参考方案2】:这在 ios 8 中运行良好。
但在 iOS 9 (Xcode 7) 中,我变成了一个警告: “在实现 'supportedInterfaceOrientations' 时返回类型冲突:'UIInterfaceOrientationMask'(又名'enum UIInterfaceOrientationMask')与'NSUInteger'(又名'unsigned long')”
我已将其更改为:
-(UIInterfaceOrientationMask)supportedInterfaceOrientations
return UIInterfaceOrientationMaskPortrait;
【讨论】:
【参考方案3】:所选答案的 Swift 版本:
override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask
if self.topViewController is ViewController
return .Portrait
else
return .All
【讨论】:
以上是关于iOS 7 未调用supportedInterfaceOrientations的主要内容,如果未能解决你的问题,请参考以下文章
Titanium Facebook 模块未在 iOS 7 上完成登录
将设备更新到 iOS 14.7.1 后,iOS Flutter 应用程序未运行