gpt4 book ai didi

ios - 在 iOS 中呈现锁屏的最佳方式是什么?

转载 作者:行者123 更新时间:2023-11-30 11:21:08 27 4
gpt4 key购买 nike

我想知道在 iOS(swift) 中呈现锁屏的最佳方式。

例如)如果用户按下主页按钮或接到电话,我想在用户重新进入应用程序时显示锁定屏幕。

所以,我尝试了这种方法。

func applicationWillResignActive(_ application: UIApplication) {
guard let passcodeManageView = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "passcodeManageView") as? PasscodeManageViewController else { return }

if let window = self.window, let rootViewController = window.rootViewController {
var currentController = rootViewController
while let presentController = currentController.presentedViewController {
currentController = presentController
}
currentController.present(passcodeManageView, animated: true, completion: nil)
}
}

实际上,效果还不错。

但是,如果显示警报窗口,则无法正常工作。

我该如何修复它? (对不起我的英语。)

最佳答案

在这些情况下,警报 View 始终是一个问题。一个快速的解决方案可能是检查警报 View 是否显示并将其关闭。我玩了以下内容:

    func showOverlayController(currentController: UIViewController) {
currentController.present(OverlayViewController(), animated: true, completion: nil)
}

if let window = UIApplication.shared.keyWindow, let rootViewController = window.rootViewController {
var currentController = rootViewController
while let presentController = currentController.presentedViewController {
guard presentController as? UIAlertController == nil else {
presentController.dismiss(animated: false) {
showOverlayController(currentController: currentController)
}
return
}
currentController = presentController
}
showOverlayController(currentController: currentController)
}
抛开动画,所有这一切看起来仍然非常糟糕,因为我怀疑如果导航 Controller 或选项卡栏 Controller (或任何其他类型的内容 View Controller )内的 View Controller 会呈现警报 View ,则此问题将再次出现。您可以使用与查找顶部 Controller 相同的逻辑来始终在顶部 Controller 上显示警报 View 来克服这个问题。

所以我转向了另一种方式,即我宁愿更改 Root View Controller 而不是呈现覆盖层。所以我尝试了以下方法:

static var currentOverlay: (overlay: OverlayViewController, stashedController: UIViewController)?
static func showOverlay() {
guard currentOverlay == nil else { return }
guard let currentController = UIApplication.shared.keyWindow?.rootViewController else { return }

let overlay: (overlay: OverlayViewController, stashedController: UIViewController) = (overlay: OverlayViewController(), stashedController: currentController)
self.currentOverlay = overlay

UIApplication.shared.keyWindow?.rootViewController = overlay.overlay
}
static func hideOverlay() {
guard let currentOverlay = currentOverlay else { return }
self.currentOverlay = nil
UIApplication.shared.keyWindow?.rootViewController = currentOverlay.stashedController
}

效果很好...直到再次显示警报 View 。因此,经过一番检查后,我发现在警报 View 的情况下,您的应用程序有多个窗口。警报会在当前窗口上创建一个新窗口是有道理的,但我不确定有人认为它是直观的,或者以任何可能的方式呈现警报 View 是有意义的。然后我会期望像 UIApplication.shared.showAlert(alert) 这样的东西,但让我们把这种愚蠢放在一边。

我在这里看到的唯一真正的解决方案是为对话框添加一个新窗口。为此,您可以浏览网络。似乎对我有用的是:

static var currentOverlayWindow: (overlay: OverlayViewController, window: UIWindow, previousWindow: UIWindow)?
static func showOverlay() {
guard currentOverlay == nil else { return }
guard let currentWindow = UIApplication.shared.keyWindow else { return }

let overlay: (overlay: OverlayViewController, window: UIWindow, previousWindow: UIWindow) = (overlay: OverlayViewController(), window: UIWindow(frame: currentWindow.bounds), previousWindow: currentWindow)
self.currentOverlayWindow = overlay

overlay.window.backgroundColor = UIColor.black
overlay.window.rootViewController = overlay.overlay
overlay.window.windowLevel = UIWindowLevelAlert + 1
overlay.window.makeKeyAndVisible()

}
static func hideOverlay() {
guard let currentOverlayWindow = currentOverlayWindow else { return }
self.currentOverlay = nil
currentOverlayWindow.window.isHidden = true
currentOverlayWindow.previousWindow.makeKeyAndVisible()
}

只是为了填补空白。我用作覆盖 View Controller 的内容:

class OverlayViewController: UIViewController {

override func viewDidLoad() {
super.viewDidLoad()
let button = UIButton(frame: CGRect(x: 12.0, y: 100.0, width: 150.0, height: 55.0))
button.setTitle("Dismiss", for: .normal)
view.addSubview(button)
button.addTarget(self, action: #selector(onButton), for: .touchUpInside)
}
@objc private func onButton() {
AppDelegate.hideOverlay()
// self.dismiss(animated: true, completion: nil)
}

}

关于ios - 在 iOS 中呈现锁屏的最佳方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51259582/

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