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

时间:2017-06-02 16:13:15

标签: ios swift orientation uibarbuttonitem uitoolbar

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

5 个答案:

答案 0 :(得分:2)

根据View Controller编程指南

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

所以你需要继承'UINavigationController',实现shouldAutorotate并在故事板中使用你的导航控制器类。

Swift 3

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

答案 1 :(得分:1)

为什么不根据需要旋转有问题的视图-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属性不会影响自动布局。自动布局根据未转换的帧计算视图的对齐矩形。 - 如果您使用自动布局,这可能不适用于您的目的....我承认这是一个kludge。

答案 2 :(得分:1)

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

可能性1

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

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

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

可能性2

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

  1. 在视图控制器中禁用自动旋转。通过覆盖ViewController的shouldAutoRotate variable

  2. 来完成此操作
  3. 在界面构建器中:将静态视图以外的所有内容放在自定义UIView中。

  4. Observe设备orientation changes并在设备的方向发生变化时旋转状态栏和自定义视图(您在步骤2中创建)。

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

    轮换观看次数

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

答案 3 :(得分:1)

简单。您应该简单地覆盖shouldRotate变量并将其设置为假,以防止您想要轮换的VC。

更新 - Swift 3

override var shouldAutorotate: Bool {
    return false    
}

答案 4 :(得分:0)

我在这里使用了所有答案的信息,以及这篇文章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。一旦我做到了,它就完美了。感谢所有回答这个问题的人。