gpt4 book ai didi

ios - 维护添加到 KeyWindow 的自定义 UIView

转载 作者:行者123 更新时间:2023-11-28 05:38:40 28 4
gpt4 key购买 nike

我正在为我的应用开发同步功能。

我想要实现的是显示一个自定义的 UIView,它将作为用户的指示器,无论用户在什么屏幕上(例如导航到仪表板、设置、配置文件页面等),同步正在进行中.短期内,它将静态地固定在应用程序中的某个位置。

在网上做了一些研究后,我得出的结论是使用 keyWindow 并向其添加一个 subview 。

这是我的代码

override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)

if let window = UIApplication.shared.keyWindow {
window.windowLevel = .statusBar

let uiView = UIView()
uiView.backgroundColor = .green

window.addSubview(uiView)

uiView.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
uiView.heightAnchor.constraint(equalToConstant: 150),
uiView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 25),
uiView.topAnchor.constraint(equalTo: view.topAnchor, constant: 150),
uiView.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 0.4)
])
}
}

以上代码运行良好,我可以将自定义 View 附加到 keyWindow。但是,当用户导航到另一个屏幕时,添加的 customView 将消失,并且仅在用户返回上一个屏幕时显示。

有人可以指导我缺少的部分吗?我哪里做错了?

谢谢

最佳答案

根据评论,我添加了创建新窗口的最低要求,该窗口现在可以始终位于您的 View Controller 甚至其他窗口之上:

class OverlayViewController: UIViewController {

private var myWindow: UIWindow? // Our own window needs to be retained

override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = UIColor.black.withAlphaComponent(0.3)
view.addSubview({
let label = UILabel(frame: .zero)
label.text = "This is an overlay."
label.sizeToFit()
label.center = CGPoint(x: view.bounds.midX, y: view.bounds.midY)
return label
}())

view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(onTap)))
}

@objc private func onTap() {
myWindow?.isHidden = true
myWindow?.removeFromSuperview()
myWindow = nil
}

static func showInNewWindow() {
let window = UIWindow(frame: UIScreen.main.bounds)
// window.windowLevel = .alert
// window.isUserInteractionEnabled = false
window.rootViewController = {
let controller = OverlayViewController() // OR UIStoryboard(name: "<#FileName#>", bundle: nil).instantiateViewController(withIdentifier: "<#Storyboard Identifier#>")
controller.myWindow = window
return controller
}()

window.makeKeyAndVisible()
}

}

所以这只是一个简单的 View Controller 示例,只需调用 OverlayViewController.showInNewWindow() 即可在项目的任何地方使用。 View Controller 可以来自 Storyboard。

有趣的部分是 showInNewWindow,它创建一个新窗口和这个 View Controller 的一个实例,该实例被设置为 Root View Controller 。要显示新窗口,您只需调用 makeKeyAndVisible。要删除它,只需隐藏它并将其从 superview 中删除,就像在 onTap 中所做的那样。在这种情况下,窗口被 View Controller 引用,它应该创建一个保留周期。似乎这是强制性的。这也意味着我们需要在通过调用 myWindow = nil 关闭窗口后进行一些清理。

还有一些可能的设置,比如您可以禁用用户交互并允许用户继续使用此窗口下方的窗口 (window.isUserInteractionEnabled = false)。并且您可以设置窗口的级别以显示它的显示位置 (window.windowLevel = .alert)。您可以尝试使用这些值。设置哪个取决于您希望窗口处于什么级别。

关于ios - 维护添加到 KeyWindow 的自定义 UIView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57723139/

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