有没有办法让单个视图不旋转?

Posted

技术标签:

【中文标题】有没有办法让单个视图不旋转?【英文标题】:Is there a way to have a single view not rotate? 【发布时间】:2017-06-02 16:13:15 【问题描述】:

我正在尝试创建一个不随设备方向旋转的视图。我只希望这个视图不旋转,因为我有一个不想旋转的 UIToolbar。这可能吗?如果是这样,我该如何实施?我正在使用斯威夫特。此外,是否可以在 UIToolbar 上以设备方向旋转 UIBarButtonItems?如果是这样,我该如何实施?重申一下:我希望其中的视图和工具栏不随方向旋转;我希望工具栏上的按钮随方向旋转。谢谢。

【问题讨论】:

Disabling auto rotation for a UIView的可能重复 @devian 这不是重复的,因为我不希望我的工具栏随方向旋转。我希望工具栏上的按钮随方向旋转。另外,我不相信这个问题是用 Swift 写的。 【参考方案1】:

根据视图控制器编程指南

如果您想暂时禁用自动旋转,请避免操作方向蒙版来执行此操作。相反,覆盖初始视图控制器上的 shouldAutorotate 变量。在执行任何自转之前调用此方法。如果返回 NO,则旋转被抑制。

因此,您需要继承“UINavigationController”,实现 shouldAutorotate 并在情节提要中使用导航控制器类。

斯威夫特 3

override var shouldAutorotate: Bool 
    let currentViewController = self.topViewController
    return !currentViewController.isKind(of: DetailViewController.classForCoder())

【讨论】:

所以对于这个视图,我需要在它上面嵌入一个导航控制器,但是我如何子类化它呢?我对代码很陌生。我已经有一个 .swift 文件(Main View Controller.swift),它与我的其他视图控制器文件分开。到目前为止我有这个:import UIKit class MainViewController: UIViewController @IBOutlet var mainView: UIView! override func viewDidLoad() super.viewDidLoad() 我把你提供的代码放在哪里,还有什么其他的代码是必要的?谢谢。【参考方案2】:

为什么不根据需要将相关视图旋转 -90 度或 +90 度?如果您愿意,我很乐意提供示例代码。 编辑: 我是在建议这样的事情(但请看代码后的警告):

let degrees = 90.0 // or -90, 180 depending on phone's movement.
let rotatedView: UIView = <yourOriginalView>
rotatedView.transform = CGAffineTransform = CGAffineTransform(rotationAngle: degrees * CGFloat(M_PI / 180))

ios 8.0 及更高版本中,transform 属性不会影响自动布局。自动布局根据其未转换的框架计算视图的对齐矩形。 - 因此,如果您使用自动布局,这可能不适用于您的目的......而且我承认这是一个混乱。 ???

【讨论】:

你能提供代码吗?我不完全确定你的意思,但我想一旦我看到代码,我会的。谢谢。 你能在这方面取得进展吗?我能澄清一下吗? 查看我标记为正确的答案。这是我所需要的更加外科手术的编辑,但我想我会在我的应用程序中使用它来做其他事情(防止按钮旋转)。感谢您的跟进。【参考方案3】:

我看到了两种可能性,并且更喜欢第二种可能性,因为它不会两次旋转您的视图。我将使用术语静态视图来表示您不想旋转的单个视图(= UIToolbar)。


可能性 1

订阅设备方向更改。然后,当方向改变且 UI 旋转时,将静态视图向相反方向旋转。

例如,当您收到设备顺时针旋转 90° 的通知时:

整个用户界面(包括静态视图)将自动逆时针旋转 90° 将静态视图顺时针旋转 90°,以取消自动旋转行为。

可能性 2

禁用自动旋转行为,然后手动旋转除您不想旋转的视图之外的所有视图。一次旋转多个视图:将它们放在自定义视图中并旋转该自定义视图。这是一个分步指南:

    在视图控制器中禁用自动旋转。通过覆盖 ViewController 的 shouldAutoRotate variable 来做到这一点。

    在界面构建器中:将除静态视图之外的所有内容放在自定义 UIView 中。

    Observe device orientation changes 并在设备方向改变时旋转状态栏和您的自定义视图(您在第 2 步中创建)。

可以在以下位置找到 swift 的示例实现:GitHub/Dev1an/Static iOS toolbar


旋转视图

关于“如何旋转视图”的问题,请查看:https://***.com/a/28717635/2616297

【讨论】:

Swift 代码好吗?我对代码很陌生。谢谢。【参考方案4】:

直截了当。您应该简单地覆盖 shouldRotate 变量并将其设置为 false 用于您希望防止轮换的 VC。

更新 - Swift 3

override var shouldAutorotate: Bool 
    return false    

【讨论】:

【参考方案5】:

我使用了此处所有答案以及此帖子overriding shouldAutorotate not working in Swift 3 中的信息来找到我的问题的答案。我在 MainViewController.swift 文件中创建了一个MainNavigationController 类,然后像这样覆盖了shouldAutorotate

import UIKit

class MainNavigationController: UINavigationController 

override var shouldAutorotate: Bool 
   return false    



class MainViewController: UIViewController 

override func viewDidLoad() 
    super.viewDidLoad()

    

最后一步是进入我的 Main.storyboard 文件,单击视图的导航控制器,并将其类更改为 MainNavigationController。一旦我这样做了,它就完美地工作了。感谢所有回答这个问题的人。

【讨论】:

以上是关于有没有办法让单个视图不旋转?的主要内容,如果未能解决你的问题,请参考以下文章

使用指南针方向旋转 MapView

UITabBar 内的单个 UIViewController 自动旋转

有没有办法让 PayPal 网络视图旋转为横向模式?

通过 CSS 缓慢旋转页面

div 文字 css旋转问题

如何多次围绕锚点旋转视图