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 中的基类:
第三步
创建具有自定义方向支持的单个视图控制器,例如仅支持 portrait 和 landscape-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 插件中,对于视图控制器,如何确定是不是应该发生方向更改