Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/109.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在Swift中强制定向后恢复自动旋转_Ios_Swift_Uiinterfaceorientation_Uideviceorientation - Fatal编程技术网

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

Ios 在Swift中强制定向后恢复自动旋转,ios,swift,uiinterfaceorientation,uideviceorientation,Ios,Swift,Uiinterfaceorientation,Uideviceorientation,在我的iPhone应用程序中,我有一个只想在纵向模式下显示的视图。当导航到该视图时,它应自动显示在纵向视图中。当导航离开时,方向应更改回原来的方向,或者,如果设备方向已更改,则应适应该方向。我可以找到有关强制方向和防止自动旋转的信息。在离开该视图后,我找不到有关如何更改回正确方向的任何信息 所以我的想法是 保存初始方向(存储在currentOrientation) 订阅方向更改事件,在内容锁定为纵向时跟踪方向更改(更新currentOrientation) 离开视图时,使用currentOrie

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

所以我的想法是

  • 保存初始方向(存储在
    currentOrientation
  • 订阅方向更改事件,在内容锁定为纵向时跟踪方向更改(更新
    currentOrientation
  • 离开视图时,使用
    currentOrientation
    值恢复正确的方向
  • 编辑(代码现在已删除):除了无法工作之外,这是一种危险的做法,因为它大量使用了不受支持的API


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

  • 是否有一种记录在案的、受支持的方式来强制接口方向独立于设备方向
    setValue(UIInterfaceOrientation.Grait.rawValue,forKey:“orientation”)
    在SO和其他地方被推荐了很多次,但它确实似乎是一种不受支持的黑客行为

  • 是否有记录在案的、受支持的方法将接口方向更新为设备方向?这将需要从另一个视图中的强制界面方向“恢复”,而不必通过来回转动设备来触发自动旋转

  • 支持的是
    supportedInterfaceOrientations()
    shouldAutorotate()
    。但这些将仅在设备转到该位置后锁定接口方向。它们不能防止错误的初始方向


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

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

    更新

    我还没有时间测试这些,但这些只是我在为不同方向的不同VC实施解决方案时使用的想法,下面的一些组合很可能会起作用,我不能百分之百确定,因为我几个月前就做了这件事,不记得做过什么和没有做过什么

    首先,确保已设置屏幕截图中所示的约束。我的iPad是全屏和横向的,因为这就是我所做的,可以根据你的需要改变你的iPad(可以推断出人像和大小)

    现在,在做任何其他事情之前,我会先检查一下,看看这是否解决了问题。我需要根视图控制器,因为我需要一个用于纵向和横向的不同VC。你只需要限制它,如果这比完美的工作,否则有一些其他的事情,你可以尝试如下所述

    设置完成后,我将首先转到要限制其类并使用以下命令阻止自动旋转的视图控制器:

     override func shouldAutorotate() -> Bool {
        return false
    }
    
    现在,如果你这样做,因为你是限制肖像,我猜你真的不关心倒置,所以你不需要做任何额外的事情。如果确实要使用
    viewwilltransitionosize
    方法并手动旋转

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

    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语句使用了不同的路径来相应地推送我想要的一个,但是您可以手动推送两个语句的纵向语句,希望上面的一种方法可以帮助您。

    您设置方向的操作没有文档记录,也不受支持。只为这一个视图添加横向支持可能比尝试控制旋转更容易。理想情况下,系统会在离开方向锁定视图后保持正确的方向,但不会。有没有更简单的方法来实现这一点?创建该视图的横向版本不是一个选项。您应该删除
    设置值(…forKey:“orientation”)
    位,因为这是未记录和支持的。您应该能够使用
    supportedInterfaceOrientations()
    shouldAutorotate()
    attemptRotationToDeviceOrientation()
    实现您想要的。只是好奇(不是争论)-为什么创建视图的横向版本不是一个选项?我对您正在开发的UX感兴趣。谢谢,Aaron,我将进一步研究它,并尝试使用支持的接口提出一个更简单的解决方案。是的,不去景观是一个设计决定。这是一个跨平台的应用程序,在Windows和Android中启动,视图分别是中心页面或视图寻呼机。它有一个全屏背景图像,几乎是应用程序的核心。即使我设法重新排列了所有元素,在水平视图中看起来也不太好。完全