使用 UINavigationController iOS 6 弹回初始视图控制器时方向更改

Posted

技术标签:

【中文标题】使用 UINavigationController iOS 6 弹回初始视图控制器时方向更改【英文标题】:Orientation changes when pop back to the initial viewcontroller using UINavigationController iOS 6 【发布时间】:2013-11-06 12:50:44 【问题描述】:

我有一个导航控制器,其中根视图控制器即横向和纵向都支持 VC1。当我在横向推动另一个视图控制器时,即。 VC2 只支持纵向模式,回到 VC1,视图将变为纵向。但我仍然处于横向模式。请帮我解决 ios 6 问题。

请检查以下代码。

MyViewController1 *theController =[[MyViewController1 alloc] init];
UINavigationController *navCntlr = [[UINavigationController alloc]      initWithRootViewController:theController];
[self.navigationController presentViewController:navCntlr animated:YES completion:nil];           [theController release];
[navCntlr release];

在 MyViewController1 中

-(BOOL)shouldAutorotate

    return YES;

-(NSUInteger)supportedInterfaceOrientations

    return  UIInterfaceOrientationMaskAllButUpsideDown;

在 VC2/MyViewController2 中我添加了以下代码。

-(BOOL)shouldAutorotate

    return YES;

-(NSUInteger)supportedInterfaceOrientations

    return  UIInterfaceOrientationMaskPortrait;

我也继承了根导航栏。

【问题讨论】:

【参考方案1】:

实际上,这被确定为 IOS6 中的一个错误,它发生在 ImageViewController 上,它只支持纵向方向......所以我花了很多时间找到了一种解决方法......

希望这会有所帮助 所以首先要做的事情......

在您的 AppDelegate.h 中添加一个属性

@property BOOL model;

那么 在 AppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

    // Override point for customization after application launch.
    self.model=NO;

    return YES;

在 AppDelegate.m 中也添加这个方法

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window


    if(!self.model)
        return  UIInterfaceOrientationMaskLandscape; //or needed orientation
    else

        return UIInterfaceOrientationMaskAllButUpsideDown;



然后在你的视图控制器中展示 VC2 之前

实施 这段代码...

AppDelegate *appdelegate=(AppDelegate*)[[UIApplication sharedApplication] delegate];
            appdelegate.model=YES;

然后你只需更改 VC2 的 viewWillDisappear 中的值

AppDelegate *appdelegate=(AppDelegate*)[[UIApplication sharedApplication] delegate];
            appdelegate.model=NO;

【讨论】:

感谢@Raon 的回复。我想我没有清楚地解释我的问题,抱歉。 VC1 应该支持两个方向,而 VC2 应该只支持纵向,当我在横向模式下转到 VC2 时,在从 VC2 中选择横向模式后,它只会以纵向模式显示其视图。 VC1 视图应为横向,但当前未发生。由于 VC2 不支持横向,当我来来去去时,VC1 视图也被旋转为纵向。请建议 @user2960314 所以你说你需要相同的方向,即VC1可能是横向/纵向>> VC2(纵向)>> VC1(横向或纵向)所以如果VC1在它之前是纵向的当它在 VC2 之后重新出现时应该返回到纵向,如果 Vc2 是横向的,它应该保持横向.. @Raon.. 这是非常不正常的测试方式。当我将设备从 VC1 保持为横向并推送另一个仅支持纵向的视图 VC2 时,我发现了这个问题,因此它仅以纵向加载其视图(请注意,设备仍处于横向),现在选择 VC2 上的 VC1支持这两种方向已将其视图更改为纵向,即使设备仍处于横向状态。问题出在 VC1 中,当我回来时它应该是横向的,但不是。 @user2960314 这是 6.0 的问题吗?还是其他任何有同样问题的? 不确定@Raon 所以只有我在这里发帖。这样如果其他人有同样的问题。

以上是关于使用 UINavigationController iOS 6 弹回初始视图控制器时方向更改的主要内容,如果未能解决你的问题,请参考以下文章

UINavigationcontroller 中未使用的视图会发生啥?

使用 push segue 时 UINavigationController 是不是强制

UINavigationController - 使用 UIBlurEffect 清除背景

一起使用 UITabBarController 和 UINavigationController

iPhone - UINavigationController - 使用 CATransaction 自定义动画

如何在 SwiftUI 中使用 UINavigationController