菜鸟教程小白 发表于 2022-12-11 18:38:17

ios - 断断续续的全屏退出过渡


                                            <p><p>我有一个自定义 ViewController ,可以通过一个按钮全屏显示。它通常是 View 的 subview (嵌入)。我从嵌入进入全屏是这样的:</p>

<pre><code>private func enterFullScreenFromEmbed() {

    self.proxyView = UIView(frame: self.view.frame)
    self.proxyView?.isHidden = true
    self.proxyView?.autoresizingMask = self.view.autoresizingMask
    self.view.superview?.addSubview(self.proxyView!)

    // Now set the frame to the screen frame
    let frame = self.view.window?.convert(self.view.frame, from: self.proxyView?.superview)
    self.view.window?.addSubview(self.view)
    self.view.frame = frame!

    self.isFullscreen = true

    UIView.animate(withDuration: 0.25) {
      self.view.frame = self.view.window!.bounds
      self.view.layoutIfNeeded()
      self.setNeedsStatusBarAppearanceUpdate()
    }
}
</code></pre>

<p>并从全屏退出:</p>

<pre><code>private func exitFullScreenToEmbed() {

    let frame = self.view.window?.convert(self.view.frame, to: self.proxyView?.superview)
    self.proxyView?.superview?.addSubview(self.view)
    self.view.frame = frame!

    self.isFullscreen = false

    UIView.animate(withDuration: 0.25, animations: {

      self.view.frame = self.proxyView!.frame

      self.view.layoutIfNeeded()
      self.setNeedsStatusBarAppearanceUpdate()
    }) { (_) in
      self.proxyView?.removeFromSuperview()
      self.proxyView = nil
    }
}
</code></pre>

<p>这很好,除了我在进入全屏动画中隐藏状态栏,并在退出全屏动画中显示它。这会导致我的顶 View 跳回原位,而没有动画。</p>

<p>注意,<code>isFullscreen</code> 变量隐藏了状态栏。 </p>

<pre><code>override var prefersStatusBarHidden: Bool {
    return isFullscreen
}

override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation {
    return .slide
}
</code></pre>

<p>这里是动画的 GIF:</p>

<p> <a href="https://imgur.com/a/528X8" rel="noreferrer noopener nofollow">Horizonal</a> </p>

<p> <a href="https://imgur.com/a/7ID15" rel="noreferrer noopener nofollow">Vertical</a> </p>

<p>请注意风景的顶部和底部(在风景上更容易看到)。在顶部,玩家框架会立即设置为旧位置,这会将所有内容向下移动 20 像素(或状态栏的高度)</p>

<p>这与隐藏状态栏有关。有人有解决办法吗?</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>我想通了。这是一种 hacky 并且没有经过全面测试,但这是我想出的解决方案。</p>

<p>首先,获取一个变量来保存状态栏高度(不是0)。</p>

<pre><code>var statusBarHeight: CGFloat = UIApplication.shared.statusBarFrame.height != 0 ? UIApplication.shared.statusBarFrame.height : 20.0
</code></pre>

<p>然后,设置状态栏框架更改的通知。</p>

<pre><code>NotificationCenter.default.addObserver(self, selector: #selector(SKPlayerViewController.updateLocalStatusBarFrameHeight), name: .UIApplicationDidChangeStatusBarFrame, object: nil)
</code></pre>

<p>现在,在方法中,仅当高度不为 0 时才更新变量。我们保存高度是因为状态栏可能不是 20(如果正在调用等)。</p>

<pre><code>@objc private func updateLocalStatusBarFrameHeight() {
      let height = UIApplication.shared.statusBarFrame.height
      if height &gt; 0 {
            self.statusBarHeight = height
      }
    }
</code></pre>

<p>现在,我更新了我的 <code>exitFullScreenToEmbed()</code>,仅当不是横向时才通过 <code>statusBarHeight</code> 减去计算的帧原点(因为状态栏隐藏在横向中)。</p>

<pre><code>private func exitFullScreenToEmbed() {

    var frame = self.view.window?.convert(self.view.frame, to: self.proxyView?.superview)
    self.proxyView?.superview?.addSubview(self.view)

    if !(UIApplication.shared.statusBarOrientation == .landscapeRight || UIApplication.shared.statusBarOrientation == .landscapeLeft) {
      frame?.origin.y -= self.statusBarHeight
    }

    self.view.frame = frame!

    self.isFullscreen = false

    UIView.animate(withDuration: 0.25, animations: {

      self.view.frame = self.proxyView!.frame

      self.view.layoutIfNeeded()
      self.setNeedsStatusBarAppearanceUpdate()
    }) { (_) in
      self.proxyView?.removeFromSuperview()
      self.proxyView = nil
    }
}
</code></pre>

<p>如果这对任何人有帮助,不客气。我只是在这里分享一些知识:)</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 断断续续的全屏退出过渡,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/46086670/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/46086670/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 断断续续的全屏退出过渡