天道酬勤,学无止境

How to lock orientation for iPhone for certain view controllers - Swift?

问题

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

VC1 目前以模态方式呈现 VC2。

VC1 只有方向应该是纵向,但 VC2 可以有所有方向。

问题是当我处于 VC2 并旋转到横向模式然后关闭时,VC1 也处于横向模式! 那不应该发生!

注意:没有导航控制器或 UITabbar 控制器

我在下面添加我的代码。

应用程序

func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
    if let rootViewController = self.topViewControllerWithRootViewController(rootViewController: window?.rootViewController) {
        if (rootViewController.responds(to: Selector(("canRotate")))) {
            // Unlock landscape view orientations for this view controller
            return .allButUpsideDown
        }
    }

    // Only allow portrait (standard behaviour)
    return .portrait;
}

private func topViewControllerWithRootViewController(rootViewController: UIViewController!) -> UIViewController? {
    if (rootViewController == nil) { return nil }
    if (rootViewController.isKind(of: (UITabBarController).self)) {
        return topViewControllerWithRootViewController(rootViewController: (rootViewController as! UITabBarController).selectedViewController)
    } else if (rootViewController.isKind(of:(UINavigationController).self)) {
        return topViewControllerWithRootViewController(rootViewController: (rootViewController as! UINavigationController).visibleViewController)
    } else if (rootViewController.presentedViewController != nil) {
        return topViewControllerWithRootViewController(rootViewController: rootViewController.presentedViewController)
    }
    return rootViewController
}

VC2中的代码:

 override func viewDidLoad() {
        super.viewDidLoad()
        UIDevice.current.setValue(Int(UIInterfaceOrientation.portrait.rawValue), forKey: "orientation")
}

func canRotate() -> Void {}

链接到我寻求帮助并找到此代码的地方 我找到代码的网站

非常感谢你的帮忙!

回答1

您需要按照以下步骤锁定特定 ViewController 的旋转:-

Step 1:在创建项目时,允许所有方向。 不要选择下图中的任何内容。 Step 2:如果您希望 VC1 仅具有纵向方向的实现,则在您的 ViewController 类中添加以下两个函数

override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        return UIInterfaceOrientationMask.all //return the value as per the required orientation 
    }

override var shouldAutorotate: Bool {
        return false
    }

Step 3:如果您希望 VC2 具有所有方向,则不要为其添加任何代码。

所以结论:-

在项目设置中,允许整个项目的所有方向。 限制应该在 ViewControllers 级别而不是在项目级别。

如果您希望任何 VC 具有所有方向,则不要编写任何代码。

如果你希望任何 VC 有特定的方向,那么实现上面的两个功能。

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • How to lock orientation for iPhone for certain view controllers - Swift?
    I have 2 View Controllers, VC1 and VC2. VC1 currently presents VC2 modally. VC1 only orientation should be portrait but VC2 can have all orientations. The issue is when I am in VC2 and I rotate to landscape mode and then dismiss, VC1 is in landscape mode also! That should never happen! NOTE: There is no Navigation Controller or UITabbarcontroller I am adding my code bellow. Appdelagate: func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask { if let rootViewController = self.topViewControllerWithRootViewController
  • 锁定方向在ipad ios 8 swift xcode 6.2上不起作用(locking orientation does not work on ipad ios 8 swift xcode 6.2)
    问题 我从这样的常规应用设置中将应用方向锁定为纵向 但是当我在iPad上运行我的应用程序时,它仍然旋转! 所以我应该在哪里锁定方向? 为什么苹果不能在设置中添加此功能呢? 更新: 我也尝试将这个viewController作为所有viewController的常规实现。 import Foundation import UIKit class GeneralViewController: UIViewController { override func viewDidAppear(animated: Bool) { super.viewDidAppear(animated) let value = UIInterfaceOrientation.Portrait.rawValue UIDevice.currentDevice().setValue(value, forKey: "orientation") } override func supportedInterfaceOrientations() -> Int { return Int(UIInterfaceOrientationMask.Portrait.rawValue) } override func preferredInterfaceOrientationForPresentation() ->
  • how to lock portrait orientation for only main view using swift
    I have created an application for iPhone, using swift, that is composed from many views embedded in a navigation controller. I would like to lock the main view to Portrait orientation and only a subview of a navigation controller locked in Landscape orientation. Here is an example of what i mean: UINavigationController UiViewController1 (Locked in Portrait) Initial view controller with a button placed on the navigation bar that give to the user the possibility to access to a lists where can be selected other views UIViewController2 (Locked in Landscape) UiViewController3 (Portrait and
  • 如何使用Swift锁定仅主视图的肖像方向(how to lock portrait orientation for only main view using swift)
    问题 我使用swift创建了一个iPhone应用程序,该应用程序由嵌入在导航控制器中的许多视图组成。 我想将主视图锁定为纵向,而将导航控制器的子视图锁定为横向。 这是我的意思的示例: UINavigationController UiViewController1(纵向锁定)初始视图控制器,在导航栏上带有一个按钮,使用户可以访问列表,在列表中可以选择其他视图 UIViewController2(横向锁定) UiViewController3(纵向和横向) UiViewController4(纵向和横向) ... ... 我怎样才能做到这一点? 回答1 根据Swift Apple Docs对于supportedInterfaceOrientations : 讨论当用户更改设备方向时,系统会在填充窗口的根视图控制器或显示在最上方的视图控制器上调用此方法。 如果视图控制器支持新的方向,则将窗口和视图控制器旋转到新的方向。 仅当视图控制器的shouldAutorotate方法返回true时,才调用此方法。 您的导航控制器应覆盖shouldAutorotate和supportedInterfaceOrientations ,如下所示。 为了方便UINavigationController我在UINavigationController扩展中做到了这一点: extension
  • 如何在Swift中以编程方式旋转方向?(How to rotate orientation programmatically in Swift?)
    问题 我尝试了下一个: UIDevice.currentDevice().setValue(UIInterfaceOrientation.Portrait.rawValue, forKey: "orientation") 上 viewWillAppear 但它不起作用。 如何在viewWillAppear上旋转屏幕? 更新 我使用下面的代码锁定方向: var shouldRotate = true func application(application: UIApplication, supportedInterfaceOrientationsForWindow window: UIWindow?) -> Int { if shouldRotate == true { return Int(UIInterfaceOrientationMask.Portrait.rawValue) } else { return Int(UIInterfaceOrientationMask.LandscapeLeft.rawValue) } } 斯威夫特4.0 private func application(application: UIApplication, supportedInterfaceOrientationsForWindow window: UIWindow?) -> Int {
  • 在Swift iOS中设置设备方向(Setting device orientation in Swift iOS)
    问题 我正在为iPhone开发一个快速的应用程序。 我的应用程序中有一个模式视图,我只想使用纵向视图。 我的问题是,如何以编程方式强制手机不允许旋转? 换句话说,我正在寻找的代码不允许以横向模式显示模式视图(打开人像旋转锁定)。 这仅用于1个模式视图,因此我无法关闭整个应用程序的旋转,否则我将完全禁用旋转。 我在这里的研究中找到了代码,但如果有帮助,它在目标C中。 谢谢! 回答1 您可以将这些方法粘贴到每个需要纵向显示的视图的ViewController中: override func shouldAutorotate() -> Bool { return false } override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask { return UIInterfaceOrientationMask.Portrait } 回答2 Hi for LandscapeLeft和LandscapeRight (更新Swift 2.0) 而且你有这个信息 和UIController override func shouldAutorotate() -> Bool { return true } override func supportedInterfaceOrientations() ->
  • 如何仅在Swift中将一个视图控制器的方向锁定为纵向模式(How to lock orientation of one view controller to portrait mode only in Swift)
    问题 由于我的应用程序支持所有方向。 我只想将肖像模式锁定到特定的UIViewController。 例如,假设它是“选项卡式应用程序”,并且当SignIn View模态显示时,无论用户如何旋转设备或当前设备的方向如何,我都只希望SignIn View进入纵向模式 回答1 当您具有复杂的视图层次结构时,事情会变得很混乱,例如具有多个导航控制器和/或选项卡视图控制器。 此实现将其置于各个视图控制器上,以便在它们希望锁定方向时进行设置,而不是依赖于App Delegate通过遍历子视图来找到它们。 斯威夫特3,4,5 在AppDelegate中: /// set orientations you want to be allowed in this property by default var orientationLock = UIInterfaceOrientationMask.all func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask { return self.orientationLock } 在其他一些全局struct或helper类中
  • Swift-如何检测方向变化(Swift - How to detect orientation changes)
    问题 我想将两个图像添加到单个图像视图中(即用于横向显示一个图像,用于纵向显示另一个图像),但是我不知道如何使用快速语言检测方向变化。 我尝试了这个答案,但只拍了一张图片 override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) { if UIDevice.currentDevice().orientation.isLandscape.boolValue { print("Landscape") } else { print("Portrait") } } 我是iOS开发的新手,任何建议将不胜感激! 回答1 let const = "Background" //image name let const2 = "GreyBackground" // image name @IBOutlet weak var imageView: UIImageView! override func viewDidLoad() { super.viewDidLoad() imageView.image = UIImage(named: const) // Do any additional setup
  • 如何禁用横向取向?(How can I disable landscape orientation?)
    问题 我正在制作一个iPhone应用程序,并且我需要将其设置为纵向模式,因此,如果用户将设备向侧面移动,它将不会自动旋转。 我怎样才能做到这一点? 回答1 要禁用特定View Controller的方向,您现在应该覆盖supportedInterfaceOrientations和preferredInterfaceOrientationForPresentation。 - (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 -
  • 如何只为一个视图控制器锁定方向?(How to lock orientation just for one view controller?)
    问题 我可以在一个控制器中设置纵向和锁定方向吗? 我确实尝试过: override func supportedInterfaceOrientations() -> Int { return Int(UIInterfaceOrientationMask.Portrait.rawValue) } override func shouldAutorotate() -> Bool{ return false } 但这对我没有帮助。 我必须添加其他东西吗? 回答1 此代码应该工作: override func supportedInterfaceOrientations() -> Int { return Int(UIInterfaceOrientationMask.Portrait.rawValue) } override func shouldAutorotate() -> Bool{ return false } override func preferredInterfaceOrientationForPresentation() -> UIInterfaceOrientation { return UIInterfaceOrientation.Portrait } 如果它现在对你UISplitViewController ,那么我想你的控制器在另一个控制器中(
  • How to lock orientation of one view controller to portrait mode only in Swift
    Since my app got support for all orientation. I would like to lock only portrait mode to specific UIViewController. e.g. assume it was Tabbed Application and when SignIn View appear modally, I only want that SignIn View to the portrait mode only no matter how the user rotate the device or how the current device orientation will be
  • 如何锁定纵向以仅在 ios 7 中查看(how to lock portrait orientation for only view in ios 7)
    问题 我为 Iphone 和 Ipad 创建了一个应用程序,它由两个带有导航控制器的主视图组成。 导航控制器被插入到 tabBar 控制器中。 我想将主视图锁定为纵向方向,并且只有导航控制器的子视图触发对横向和横向的可能性定位。 是否有可能? 我能怎么做? 谢谢 回答1 到目前为止给出的两个答案都是错误的。 这是你要做的: 确保在 info.plist 文件的支持方向列表中列出纵向和横向。 (默认应用程序模板包括 iPad 的所有方向,以及 iPhone 的倒置纵向,这可能是您想要的。) 你想要实现方法supportedInterfaceOrientations:在你想要限制为纵向的视图控制器中: - (NSUInteger)supportedInterfaceOrientations { return UIInterfaceOrientationMaskPortrait; } 任何包含该代码的视图控制器将仅支持纵向。 所有其他人将支持您的 info.plist 中列出的所有方向。 旧方法shouldAutorotateToInterfaceOrientation:仅当您支持 6.0 之前的操作系统版本时才需要。 如果您有时可能返回 NO(不旋转),您也只需要实现 shouldAutorotate 方法。) 回答2 这是基于UIViewController类别的通用方法,带有方法
  • 使用swift 3在VLCPlayer中播放电影时完全旋转横向视图(Rotate totally Landscape view when movie play in VLCPlayer with swift 3)
    问题 我想在电影播放时旋转我的视图控制器。 我的问题可能是重复的,但是当我发现堆栈溢出时,我尝试了很多方法。 但所有代码都不起作用。 可能是我把代码放错了。 override var shouldAutorotate: Bool { return false } override var supportedInterfaceOrientations: UIInterfaceOrientationMask { //return[.portrait,.landscapeRight] return .landscapeLeft } override var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation { //return UIInterfaceOrientation.landscapeRight return .landscapeLeft } 我把这段代码放到了 vlcplayerviewcontroller.swift 文件中。 当用户单击播放按钮时,它将转到 vlcplayerviewcontroller.swift 并且我想自动以横向模式显示电影。 我不知道我该怎么做。 我的参考链接是如何仅在 Swift 中将一个视图控制器的方向锁定为纵向模式。 回答1 在项目设置下只允许纵向设备方向。
  • iphone / ipad方向处理(iphone/ipad orientation handling)
    问题 这是人们通常向我提供指导的一个基本问题,基本上,我正在学习iPad / iPhone的开发,并最终遇到了多方位支持问题。 我查找了很多doco,而我的《 iPhone 3开发入门》一书中有很漂亮的一章。 但是我的问题是,如果我要以编程方式更改我的控件(甚至为每个方向使用不同的视图),那么人们如何维护他们的代码库? 我可以想象意大利面条代码中有如此多的问题,到处都是成千上万的“ if”检查,这会让我发疯,对UI布局进行一些小的更改。 有没有人有处理此问题的经验? 有什么好方法可以控制它? 非常感谢马克 回答1 我在视图控制器中使用两种简单的方法进行此操作: - (void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { [self adjustViewsForOrientation:toInterfaceOrientation]; } - (void) adjustViewsForOrientation:(UIInterfaceOrientation)orientation { if (orientation == UIInterfaceOrientationLandscapeLeft ||
  • iOS 8中不推荐使用“ interfaceOrientation”,如何更改此方法目标C(“interfaceOrientation” is deprecated in iOS 8, How to change this method Objective C)
    问题 我已经从可可控件下载了一个simpleCamera视图,该视图使用了这种方法 - (AVCaptureVideoOrientation)orientationForConnection { AVCaptureVideoOrientation videoOrientation = AVCaptureVideoOrientationPortrait; switch (self.interfaceOrientation) { case UIInterfaceOrientationLandscapeLeft: videoOrientation = AVCaptureVideoOrientationLandscapeLeft; break; case UIInterfaceOrientationLandscapeRight: videoOrientation = AVCaptureVideoOrientationLandscapeRight; break; case UIInterfaceOrientationPortraitUpsideDown: videoOrientation = AVCaptureVideoOrientationPortraitUpsideDown; break; default: videoOrientation =
  • 某些视图的 Xcode iphone 方向支持(Xcode iphone orientation support for certain views)
    问题 我想支持除主视图控制器之外的所有视图的所有方向。 我似乎找不到办法做到这一点。 我可以支持所有视图的方向,也可以在整个应用程序中不支持视图。 您如何支持整个应用程序中某些视图的方向? 回答1 我还没有使用需要按照您描述的方式操作的应用程序,但是当您需要控制方向支持时,Apple 文档建议您这样做: 动态控制是否发生旋转有时您可能希望动态禁用自动旋转。 例如,当您想在短时间内完全抑制旋转时,您可能会这样做。 您必须暂时禁用想要手动控制状态栏位置的方向更改(例如当您调用 setStatusBarOrientation:animated: 方法时)。 > 如果您想暂时禁用自动旋转,请避免操作方向蒙版来执行此操作。 相反,覆盖最顶层视图控制器上的 shouldAutorotate 方法。 在执行任何自转之前调用此方法。 如果它返回 NO,则旋转被抑制。 来源:http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/RespondingtoDeviceOrientationChanges/RespondingtoDeviceOrientationChanges.html#//apple_ref/doc/uid/TP40007457-CH7-SW1 回答2
  • 如何查看 iPhone 现在处于哪个位置(横向或纵向)?(How to check in which position (landscape or portrait) is the iPhone now?)
    问题 我有一个带有标签栏的应用程序,每个标签中都有导航控制器。 当用户摇动设备时, UIImageView在导航控制器中显示为子视图。 但是UIImageView必须包含一个特殊的图像,这取决于设备的当前方向。 如果我只写 - (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation) if (interfaceOrientation == UIInterfaceOrientationPortrait || interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown) { //Code } else if (interfaceOrientation == UIInterfaceOrientationLandscapeRight||interfaceOrientation == UIInterfaceOrientationLandscapeLeft) { //Code } } 如果用户在晃动之前旋转设备,视图就会变得疯狂。 有没有办法让 iPhone 的当前方向? 回答1 使用此处指定的[[UIDevice currentDevice] orientation]方法。 回答2
  • UINavigationController 中的 ViewController 方向改变(ViewController in UINavigationController orientation change)
    问题 所以我有以下层次结构: UINavigationController --> RootViewController ( UIViewController ) --> UITableViewController --> DetailViewController ( UIViewController ) 我想将 RootViewController 上的方向锁定为仅纵向,但为其余视图控制器保留所有方向。 如果我把它放到子类UINavigationController : - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { // Return YES for supported orientations return (interfaceOrientation == UIInterfaceOrientationPortrait); } -(NSUInteger)supportedInterfaceOrientations{ return UIInterfaceOrientationMaskPortrait; } 然后所有视图控制器都被锁定为纵向。 我的问题是,有没有办法只将 RootViewController 锁定到 Portrait
  • Objective-C/Swift (iOS) 何时在 View/ViewController 工作流程中应用自动约束?(Objective-C/Swift (iOS) When are the auto-constraints applied in the View/ViewController work flow?)
    问题 我在确定何时在视图设置过程中应用了XIB上的auto-contraints设置时遇到了一些问题。 更多解释: 我已经为视图设置了一个XIB 我将“模拟指标”大小设置为 iPhone 3.5 英寸我已经在这个视图中的子视图中添加了自动约束在视图控制器中,我根据viewDidLoad方法中的子视图( IBOutlet ) frames/bounds执行某些操作在视图中,我根据子视图( IBOutlet ) frames/bounds执行某些操作,在awakeFromNib方法中 在这 2 个方法( ViewController::viewDidLoad and View::awakeFromNib )中,IBOutlet 视图已加载,但尚未应用约束。 使用较大的模拟器(如 iPhone 6 模拟器)时,实际帧仍设置为 iPhone 3.5" 尺寸(宽 320)。 什么时候应用这些自动约束,什么时候应该进行需要子视图的实际框架/边界的任何必要操作? 我正在使用 XCode 6.3,Swift (1.2) 回答1 约束应用于layoutSubviews方法。 所以如果你想在UIView子类中应用它们后做一些事情,覆盖该方法: override func layoutSubviews() { super.layoutSubviews() //the frames have now
  • IOS。 如何在每个 UIViewController 上启用和禁用旋转?(iOS. How to enable and disable rotation on each UIViewController?)
    问题 我有一个 UIViewController,我想在不同场景下禁用或启用屏幕旋转 例子: if flag { rotateDevice = false } else { rotateDevice = true } 我怎样才能做到这一点? 回答1 我有答案。 在AppDelegate ,如果你旋转设备,推送视图控制器等。这个函数总是调用 快速 3/4更新 func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask { return self.restrictRotation } self.restrictRotation是一个自定义参数。 如何使用: 在 Appdelegate 中: var restrictRotation:UIInterfaceOrientationMask = .portrait 在视图控制器中: 当调用方法 ViewDidLoad 或 viewWillAppear 时。 我们会像这样改变: (UIApplication.shared.delegate as! AppDelegate).restrictRotation = .all 然后将调用