iOS:如何更改应用程序中只有一个视图控制器的方向?

Posted

技术标签:

【中文标题】iOS:如何更改应用程序中只有一个视图控制器的方向?【英文标题】:iOS: How to change Orientation of only one view controller in app? 【发布时间】:2015-02-11 08:04:11 【问题描述】:

我的应用程序的视图方向出现问题。

喜欢

我有两个视图控制器,VC1 和 VC2

VC1 已修复横向。 VC2两者都有

VC1 -> VC2 没问题。意味着当我从 VC1 转到 VC2 时,VC2 会改变它的横向和纵向方向。

但是当我从 VC2(VC2 处于纵向模式)返回 VC1 时,VC1 也处于纵向模式,但我希望 VC1 仅处于横向模式,而与 VC2 模式无关。

请大家帮帮我。从最近 2 天开始寻求解决方案。 提前致谢。

【问题讨论】:

最好的方法是 1.) 允许您的应用程序的所有方向,然后 2.) 创建自定义根视图控制器(导航或标签栏或您需要的任何东西)并通过返回顶视图控制器或可见控制器的方向支持来覆盖-supportedInterfaceOrientations方法 - 我看到了许多关于覆盖应用程序委托的疯狂示例,但您可以忽略这些概念,这些都不是正确的方法。 【参考方案1】:

解决方法见下方链接

http://swiftiostutorials.com/ios-orientations-landscape-orientation-one-view-controller/

在你的 VC1..

-(BOOL)shouldAutorotate

    return NO;


-(NSUInteger)supportedInterfaceOrientations

    return UIInterfaceOrientationMaskLandscapeLeft;

希望对你有帮助...

【讨论】:

【参考方案2】:

首先,把这个写在 AppDelegate.m 中

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

 return (UIInterfaceOrientationMaskAll);

那么,对于VC1,在哪个横向,这样写:

- (BOOL)shouldAutorotate

 return YES;


- (NSUInteger)supportedInterfaceOrientations

 return (UIInterfaceOrientationMaskPortrait);

对于两者都有的 VC2,将遮罩更改为全部。

- (NSUInteger)supportedInterfaceOrientations

return (UIInterfaceOrientationMaskAllButUpsideDown);
//OR return (UIInterfaceOrientationMaskAll);

【讨论】:

【参考方案3】:

1.为项目启用所有方向支持。

对于 VC1 添加这一行 VC1Controller 类

- (UIInterfaceOrientationMask)supportedInterfaceOrientations  
  return UIInterfaceOrientationMaskLandscape;

对于 VC2 在 VC2Controller 类中添加这个

- (UIInterfaceOrientationMask)supportedInterfaceOrientations  
      return UIInterfaceOrientationMaskAll;
    

【讨论】:

这似乎只是解决了一半。【参考方案4】:

基本上,iOS 应用中基于视图控制器的方向支持是小菜一碟——我在 Swift 中编写了代码,但 ObjC 的概念完全一样到这个。

我用UINavigationController 创建了一个快速教程,但您可以通过保留概念但稍微更新环境将其转换为UITabBarController

步骤一

最初为您的应用设置方向支持,如下所示:

第二步

创建一个简单的基于UINavigationController 的故事板,如下所示:

注意: 如果最初没有说 OrientaionSupporterController,请不要担心(如果您在这里发现一致的错字,那就加分!),我会介绍就在下一步。

第三步

创建导航控制器的子集,如下所示:

import UIKit

// MARK: - Implementation

class OrientaionSupporterController: UINavigationController 

    // MARK: - Active View Controller

    private var activeViewController: UIViewController? 
        get 
            return self.presentedViewController ?? self.topViewController // for possible modal support
        
    

    // MARK: - Orientations

    override var shouldAutorotate: Bool 
        get 
            return self.activeViewController?.shouldAutorotate ?? true // yes, rotate it, please
        
    

    override var supportedInterfaceOrientations: UIInterfaceOrientationMask 
        return self.activeViewController?.supportedInterfaceOrientations ?? .all // default is all possible orientations
    


然后确保它也成为 IB 中的基类:

第三步

创建具有自定义方向支持的单个视图控制器,例如仅支持 portraitlandscape-left

import UIKit

// MARK: - Implementation

class ViewController: UIViewController 

    // MARK: - Orientation

    override var shouldAutorotate: Bool 
        get 
            return true
        
    

    override var supportedInterfaceOrientations: UIInterfaceOrientationMask 
        return [.portrait, .landscapeLeft] // no one find that preactical but works flawlessly
    



注意:您可以随时使用 UITabBarController 转换本教程,您只需要(显然)创建一个 tab-bar-controller 的子集并使用selectedViewController 获取当前可见的。


注意#2:显然,您可以在这种方式上走得更远,您可以将自定义导航控制器嵌套在视图层次结构中,或者如果您有多个 @队列中的 987654335@ 实例并覆盖那里支持的方向以及每个单独的窗口(例如,一些支持所有四个方向,而其他一些窗口仅横向用于例如视频播放等......)

【讨论】:

以上是关于iOS:如何更改应用程序中只有一个视图控制器的方向?的主要内容,如果未能解决你的问题,请参考以下文章

在 ios cordova 插件中,对于视图控制器,如何确定是不是应该发生方向更改

如何在 iOS 8 中强制视图控制器方向?

iOS 7. 仅为一个视图控制器更改页面方向

当被模态视图控制器覆盖时,iOS 6 视图控制器布局在方向更改后不会更新

iOS:处理方向更改而不在视图控制器上启用横向模式

iOS ViewController 在方向更改后无法正确布局