在Swift中强制方向后恢复自动旋转

时间:2015-07-02 21:55:29

标签: ios swift uiinterfaceorientation uideviceorientation

在我的iPhone应用程序中,我有一个视图,我只想在纵向模式下显示。导航到该视图时,它应自动显示在纵向视图中。导航时,方向应该变回原来的状态,或者,如果设备方向已经改变,则适应该方向。我可以找到有关强制方向和防止自动旋转的信息。在离开该视图后如何更改回正确的方向时,我找不到任何内容。

所以我的想法是

  1. 保存初始方向(存储在currentOrientation
  2. 订阅方向更改事件,以便在内容锁定为肖像时跟踪方向更改(更新currentOrientation
  3. 离开视图时,使用currentOrientation值恢复正确的方向。
  4. 编辑(代码现已删除):除了它不起作用之外,它还是一种危险的方式,因为它广泛使用了不受支持的API。

    编辑:

    我相信这个问题现在可归结为以下几点:

    1. 是否有文档化的,受支持的强制界面方向独立于设备方向的方式?在{和}其他地方已经多次推荐setValue(UIInterfaceOrientation.Portrait.rawValue, forKey: "orientation"),但它确实似乎是一个不受支持的黑客攻击。

    2. 是否有文档化的,受支持的更新界面方向为设备方向的方法?这需要从另一个视图中的强制界面方向“恢复”,而不必通过来回转动设备来触发自动旋转。

    3. 支持supportedInterfaceOrientations()shouldAutorotate()。但这些只会在设备转到该位置后锁定interfaceOrientation。它们不会阻止错误的初始定位。

      有许多类似于这个的问题,表明此问题设置并不罕见,但到目前为止还没有使用支持的方法提供令人满意的完整解决方案。

1 个答案:

答案 0 :(得分:2)

我有一个类似的问题,除了我需要一个视图控制器只能在横向模式下工作而另一个在纵向模式下工作。我实现这一目标的方法是制作一个自定义的“root”视图控制器。然后在该控制器的viewWillTransitionToSize方法上检查方向,并且非动画地推送正确的视图控制器(因此它看起来像是对用户的旋转)。然后在Interface Builder中我显式设置了视图控制器的orientation属性,而不是推断。您可以通过仅在受限视图控制器上设置横向方向然后在纵向旋转上不执行任何操作并禁用受限视图控制器上的自动旋转来应用此解决方案。

<强>更新

我没有时间测试其中任何一个,但这些只是我在为不同的方向实现不同VC的解决方案时使用的想法,以下的某些组合应该有希望工作我不能成为100%肯定它,因为我几个月前这样做了,并不完全记得做了什么和不做什么。

首先确保您已设置约束,如屏幕截图所示。我的iPad全屏和风景,因为我正在做的就是把你的东西改成你需要的东西(可以推断出肖像和尺寸)。

View Controller Interface Builder

现在,在做任何其他事情之前,我先检查一下是否解决了这个问题。我需要根视图控制器,因为我需要一个不同的VC用于纵向,而另一个用于横向。你只需要限制它,如果这种方法有效,那么你可以尝试下面提到的其他一些东西。

一旦设置完毕,我首先会转到视图控制器,你想限制它的类并使用以下方法防止自动旋转:

 override func shouldAutorotate() -> Bool {
    return false
}

现在如果你这样做,因为你限制肖像我猜你不是真的在乎颠倒,所以你不需要做任何额外的事情。如果您确实想使用viewWillTransitionToSize方法并手动旋转。

如果事情仍然不起作用,你可以最终尝试根控制器的方式(但我会在最后一种情况下使用它)。下面是它的草图:

class VC : UIViewController { 
      override func viewDidLoad () { 
           UIDevice.currentDevice().beginGeneratingDeviceOrientationNotifications()
           NSNotificationCenter.defaultCenter().addObserver(self, selector: "orientationChanged:", name: "UIDeviceOrientationDidChangeNotification", object: nil)
         // this gives you access to notifications about rotations
      }
      func orientationChanged(sender: NSNotification)
      {
              // Here check the orientation using this:
              if UIInterfaceOrientationIsLandscape(UIApplication.sharedApplication().statusBarOrientation) { // Landscape }
              if UIInterfaceOrientationIsPortrait(UIApplication.sharedApplication().statusBarOrientation) { // Portrait }
           // Now once only allow the portrait one to go in that conditional part of the view. If you're using a navigation controller push the vc otherwise just use presentViewController:animated:
      }
}

我使用if语句的不同路径来推送我想要的那个,但是你可以手动推动一个肖像,并希望上面的方法之一可以帮助你。