【问题标题】:How to stop autorotion of selected subview in UIViewController如何停止 UIViewController 中选定子视图的自动旋转
【发布时间】:2016-03-11 10:29:09
【问题描述】:

我有一个视图控制器我已经在视图控制器的视图上启动了一个 AVCaptureSession,

  AVCaptureVideoPreviewLayer *captureVideoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session];

现在我这样添加,

[self.view.layer addSubLayer: captureVideoPreviewLayer]

我还在这个视图控制器的情节提要上添加了两个按钮,在设备旋转时 self.view 不应该旋转,因为它有相机在运行,但我希望捕捉和取消按钮这两个按钮对齐并旋转, 如何使用情节提要实现这一目标。

【问题讨论】:

    标签: ios objective-c uiviewcontroller uibutton rotation


    【解决方案1】:

    不幸的是,这并不像应有的那么容易。当 UI 的其余部分旋转时,您不能简单地“不旋转”单个视图。

    由于您使用的是相机,我建议您通过通知中心捕捉设备方向的变化,同时将控制器方向锁定为您的默认或当前状态。

    在方向更改时,您应该尝试使用按钮或其他任何应该旋转的东西来旋转视图。如果所有控件都添加到与视图控制器大小相同且位于视图控制器中心的单个视图中,则最好这样做。这意味着该视图的约束是center xcenter ywidthheight。您需要宽度和高度的插座,并在代码中手动设置它们。当视图将布局子视图(这是在视图控制器中覆盖的一种方法)时,只需将widthheight 设置为与视图控制器controller.view.frame.size 相同。到此为止,如果禁用旋转,您的应用程序看起来应该与现在完全相同。

    现在是有趣的部分:您需要检查当前方向并使用按钮在视图上应用旋转变换。您需要的是一个保存当前界面方向的属性,并且在更改该方向后,您应该对视图应用不同的变换。设备方向不会为您提供界面方向,因为设备方向包括额外的位置。因此,当设备方向更改时,您需要使用 switch 语句,并且只有在您更改界面方向时才有意义的 4 个方向。

    一旦你有了所有的东西,你应该创建一个方法,将用户界面方向作为输入,并使用按钮重新定位视图。 (假设您默认使用纵向)当界面方向为横向时,您需要交换widthheight,如widthConstraint.constant = controller.view.frame.size.height,并根据方向应用旋转变换。

    应该在以下情况下调用此方法:

    • 控制器将随着应用程序状态栏的方向变得可见
    • 当视图以与之前保存的视图相同的方向进行布局时,将变为可见或设备方向发生变化
    • 当设备方向发生变化时,如果新方向有意义并且与当前设置的界面方向不同

    还有其他方法可以做到这一点。例如,您可以保持视图控制器的旋转并使用相同的过程旋转相机视图,这更容易,因为您可以使用viewWillTransitionToSizeanimateAlongsideTransition,但动画可能无法接受,因为您可能会看到黑色部分当视图控制器定向时。虽然我不确定这是否真的会发生,即使它确实发生了,也可以通过禁用控制器视图上的绑定剪辑来修复它。

    【讨论】:

      猜你喜欢
      • 2011-09-20
      • 1970-01-01
      • 2012-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多