菜鸟教程小白 发表于 2022-12-12 12:14:31

ios - 以编程方式锁定 iDevice 方向


                                            <p><p>在我们正在开发的应用程序中,我们有一个选项让用户选择首选方向<em>(即,如果他们选择 <code>Portrait</code>,应用程序将被锁定为纵向方向,<code>Landscape</code> 并且如果 <code>Both</code> 被选中,该应用程序将在所有方向上运行)</em> 我正在分享我尝试过的代码,我不确定这个功能是否完全<strong>可行</strong>。</p>

<pre><code>//MARK:- ORIENTATION
func changeOrientation(orientation: String) {
    switch orientation {
    case &#34;Portrait&#34;:
      UserDefaults.standard.set(&#34;Portrait&#34;, forKey: UserDefaultsKeys.preferredOrientation)
      appDelegate.preferredOrientation = &#34;Portrait&#34;
      let value = UIInterfaceOrientation.portrait.rawValue
      UIDevice.current.setValue(value, forKey: &#34;orientation&#34;)
      break
    case &#34;Landscape&#34;:
      UserDefaults.standard.set(&#34;Landscape&#34;, forKey: UserDefaultsKeys.preferredOrientation)
      appDelegate.preferredOrientation = &#34;Landscape&#34;
      let value = UIInterfaceOrientation.landscapeLeft.rawValue
      UIDevice.current.setValue(value, forKey: &#34;orientation&#34;)
      break
    default:
      UserDefaults.standard.set(&#34;Both&#34;, forKey: UserDefaultsKeys.preferredOrientation)
      appDelegate.preferredOrientation = &#34;Both&#34;
      break
    }
    /*not necessary*/
    let vc = UIViewController()
    UIViewController.attemptRotationToDeviceOrientation()//forces to rotate
    /*not necessary*/
    self.present(vc, animated: false, completion: nil)
    UIView.animate(withDuration: 0.3, animations: {
      vc.dismiss(animated: false, completion: nil)
    })
    /*not necessary*/
}

open override var supportedInterfaceOrientations: UIInterfaceOrientationMask{
    get {
      switch appDelegate.preferredOrientation {
      case &#34;Portrait&#34;:
            return .portrait
      case &#34;Landscape&#34;:
            return .landscape
      default:
            return .all
      }
    }
}

open override var shouldAutorotate: Bool {
    get {
      return true
    }
}
</code></pre>

<p>但是,如果我在纵向模式下选择“横向”,它会自动切换到横向。但是,如果我将设备旋转回纵向,它也可以正常工作(不应该按照要求工作)。该要求类似于我们仅使用纵向模式设置项目时发生的情况以及设备旋转到横向模式时的行为。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>我刚刚编写了一个示例项目来测试这是否可行。嗯,我认为是!不幸的是</p>

<blockquote>
<p>UIViewController.attemptRotationToDeviceOrientation()</p>
</blockquote>

<p>并没有像我希望的那样神奇地完成这项工作 - 它比这更复杂一点。
请看下面的代码。您需要的所有魔法都发生在 <code>forceChangeOrientations</code> 操作中。</p>

<pre><code>    class ViewController: UIViewController {

    enum Orientation {
      case Landscape
      case Portrait

      mutating func changeOrientation() {
            if self == .Portrait {
                self = .Landscape
            }
            else {
                self = .Portrait
            }
      }

      func supportedInterfaceOrientations() -&gt; UIInterfaceOrientationMask {
            switch self {
            case .Landscape:
                return .Landscape
            case .Portrait:
                return .Portrait
            }
      }

      func preferredInterfaceOrientationForPresentation() -&gt; UIInterfaceOrientation {
            switch self {
            case .Landscape:
                return UIInterfaceOrientation.LandscapeLeft
            case .Portrait:
                return .Portrait
            }
      }
    }

    var currentOrientation: Orientation = .Portrait

    //    Returns a Boolean value indicating whether the view controller&#39;s contents should auto rotate.
    override func shouldAutorotate() -&gt; Bool {
      return true
    }

//    Returns all of the interface orientations that the view controller supports.
    override func supportedInterfaceOrientations() -&gt; UIInterfaceOrientationMask {
      return currentOrientation.supportedInterfaceOrientations() //UIInterfaceOrientationMask.All
    }

//    Returns the interface orientation to use when presenting the view controller.
    override func preferredInterfaceOrientationForPresentation() -&gt; UIInterfaceOrientation {
      return UIInterfaceOrientation.Portrait
    }

    @IBAction func forceChangeOrientations(sender: AnyObject) {
      self.currentOrientation.changeOrientation()

      let value = self.currentOrientation.preferredInterfaceOrientationForPresentation().rawValue
      UIDevice.currentDevice().setValue(value, forKey: &#34;orientation&#34;)
      UIViewController.attemptRotationToDeviceOrientation()
    }

}
</code></pre></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 以编程方式锁定 iDevice 方向,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/39996894/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/39996894/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 以编程方式锁定 iDevice 方向