防止在视图控制器中改变方向
Posted
技术标签:
【中文标题】防止在视图控制器中改变方向【英文标题】:prevent change orientation in a viewcontroller 【发布时间】:2015-09-14 06:48:08 【问题描述】:我有像whatsapp这样的消息应用程序...... 像这样的层次结构:
Tab Bar Controller
Navigation Controller
View Controller
Target Controller
所以我们要像这样从 appDelegate 进入 Tabbar
UITabBarController *ivc = [storyboard instantiateViewControllerWithIdentifier:@"mainTab"];
self.window.rootViewController = ivc;
[self.window makeKeyAndVisible];
我的问题
我想在 Target Controller 的某些条件下锁定方向
但是-(BOOL)shouldAutorotate
supportedInterfaceOrientations
没有打电话,我已经阅读了一些关于此的帖子,但我找不到正确的解决方案。
像这样的帖子:
Lock Screen Rotation in ios 8
Handling autorotation for one view controller in iOS7
更新
经过几个小时的搜索,我找到了解决方案,但这还不够 这个链接提示我,如果我们使用 UITabController 一切都会改变,我们应该调用
-(NSUInteger)navigationControllerSupportedInterfaceOrientations:(UINavigationController *)navigationController
return navigationController.topViewController.supportedInterfaceOrientations;
-(NSUInteger)tabBarControllerSupportedInterfaceOrientations:(UITabBarController *)tabBarController
return ((parentOfTarget*)[tabBarController.viewControllers objectAtIndex:0]).supportedInterfaceOrientations;
这导致我发出改变方向的通知并阻止它,但我会看到状态栏的方向。
我想我需要打电话
navigationController.topViewController.shouldAutorotate;
但它会导致崩溃;(
TabBarController: Orienting views in different orientations
【问题讨论】:
【参考方案1】:你应该使用-supportedInterfaceOrientations' instead of
-shouldAutorotate`。
只有在运行时确定方向时才应使用“稍后”。在您的情况下,您的视图控制器将始终只支持纵向模式。
接下来,导航控制器的委托必须实现以下方法,以返回在导航堆栈顶部的视图控制器上调用 -supportedInterfaceOrientations
的结果。
-(NSUInteger)navigationControllerSupportedInterfaceOrientations:(UINavigationController *)navigationController
return navigationController.topViewController.supportedInterfaceOrientations;
【讨论】:
我已经调用了supportedInterfaceOrientations,但没有一个在我的ViewController中调用,我会试试你的提示。 (我应该在哪里实现这个 Delegate ,在 TagetViewController 中? 任何方向代表都没有在我的viewController
中调用,只有wilRotate
和didRoate
在我的ViewControoler
中调用,我对此感到非常困惑。
@请再检查一遍兄弟【参考方案2】:
使用此方法停止横向显示
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
// Return YES for supported orientations
return (interfaceOrientation == UIInterfaceOrientationPortrait);
// Use this to allow upside down as well
//return (interfaceOrientation == UIInterfaceOrientationPortrait || interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown);
如果你想使用 shouldAutorotate 委托方法,你可以在 appdelegate.m 中使用。
- (BOOL)shouldAutorotate
return NO;
如果您使用的是最新的 ios,请使用以下方法:-
- (NSUInteger) supportedInterfaceOrientations
// Return a bitmask of supported orientations. If you need more,
// use bitwise or (see the commented return).
return UIInterfaceOrientationMaskPortrait;
// return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown;
- (UIInterfaceOrientation) preferredInterfaceOrientationForPresentation
// Return the orientation you'd prefer - this is what it launches to. The
// user can still rotate. You don't have to implement this method, in which
// case it launches in the current orientation
return UIInterfaceOrientationPortrait;
【讨论】:
它已被弃用,也不会在我的视图控制器中调用 我知道它已被弃用,但它的工作原理......好的,你可以看到我对此查询的更新答案 还不行,是UINavigationController引起的以上是关于防止在视图控制器中改变方向的主要内容,如果未能解决你的问题,请参考以下文章
从 UINavigationController 弹出视图会改变设备方向