gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:08:10 24 4
gpt4 key购买 nike

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

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()
}
}

并退出全屏:

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
}
}

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

请注意,isFullscreen 变量用于隐藏状态栏。

override var prefersStatusBarHidden: Bool {
return isFullscreen
}

override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation {
return .slide
}

这是动画的 gif:

Horizonal

Vertical

注意两者的顶部和横向的底部(在横向上更容易看到)。在顶部,播放器框架立即设置为旧位置,并将所有内容向下移动 20 像素(或状态栏的任何高度)

跟隐藏状态栏有关系。有人有解决方案吗?

最佳答案

我想通了。它有点老套,没有经过全面测试,但这是我想出的解决方案。

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

var statusBarHeight: CGFloat = UIApplication.shared.statusBarFrame.height != 0 ? UIApplication.shared.statusBarFrame.height : 20.0

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

NotificationCenter.default.addObserver(self, selector: #selector(SKPlayerViewController.updateLocalStatusBarFrameHeight), name: .UIApplicationDidChangeStatusBarFrame, object: nil)

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

@objc private func updateLocalStatusBarFrameHeight() {
let height = UIApplication.shared.statusBarFrame.height
if height > 0 {
self.statusBarHeight = height
}
}

现在,我更新了我的 exitFullScreenToEmbed(),仅在不是横向时(因为状态栏隐藏在横向中)用 statusBarHeight 减去计算的帧原点。

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
}
}

如果这对任何人有帮助,不客气。我只是来分享一些知识:)

关于ios - 断断续续的全屏退出过渡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46086670/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com