gpt4 book ai didi

ios - FirstViewController 在另一个 SecondViewController 之上,其中 SecondViewController 是可点击的

转载 作者:行者123 更新时间:2023-11-28 11:43:30 24 4
gpt4 key购买 nike

我正在尝试创建出现在最顶部 View Controller 上的通用警报,而底部 View Controller 仍然可以点击。此警报只是一个 20 点高的状态行,用于通知用户网络可达性。如何使 UIViewController 无法与用户交互?

最佳答案

请注意,我不使用 Storyboard 或 XIB此外,如果您的目标是 iOS11 及更高版本,则在使用自动布局代码时需要使用 safeAreaLayoutGuide

解决方案有两个。

首先,创建一个基础 View Controller ,并让所有需要显示警报的 View Controller 从该基础 View Controller 扩展。

然后新建一个swift文件,NSObject的子类。让我们说 NetworkAlerter.swift 并复制粘贴下面的代码(视情况而定)

import UIKit

class NetworkAlerter: NSObject {

var window :UIWindow? = UIApplication.shared.keyWindow

var alertShowingConstraint : NSLayoutConstraint?
var alertHidingConstraint : NSLayoutConstraint?

var closeTimer : Timer? = nil

public lazy var networkIndicatorLabel : UILabel = {
let label : UILabel = UILabel(frame: .zero)
label.translatesAutoresizingMaskIntoConstraints = false
label.textAlignment = NSTextAlignment.center
return label
}()


override init() {
super.init()
createSubviews()
}

required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}

deinit {
print("Time to deinit")
networkIndicatorLabel.removeFromSuperview()
}

func createSubviews() {
guard let window = window else {
print("Some thing wrong with Window initialization!!")
return
}
window.addSubview(networkIndicatorLabel)
addAutolayout()
}

func addAutolayout() {
guard let window = window else {
print("Some thing wrong with Window initialization!!")
return
}
alertShowingConstraint = networkIndicatorLabel.topAnchor.constraint(equalTo: window.topAnchor)
alertHidingConstraint = networkIndicatorLabel.bottomAnchor.constraint(equalTo: window.topAnchor)
alertHidingConstraint?.isActive = true
networkIndicatorLabel.heightAnchor.constraint(equalToConstant: 20).isActive = true
networkIndicatorLabel.leadingAnchor.constraint(equalTo: window.leadingAnchor).isActive = true
networkIndicatorLabel.trailingAnchor.constraint(equalTo: window.trailingAnchor).isActive = true
}

func showNetworkAlerter(networkAvailable: Bool) {
guard let window = window else {
print("Some thing wrong with Window initialization!!")
return
}
invalidateAndKillTimer()
closeTimer = Timer.scheduledTimer(timeInterval: 3.0, target: self, selector: #selector(dismissNetworkAlerter), userInfo: nil, repeats: false)

if networkAvailable {
networkIndicatorLabel.text = "Available"
networkIndicatorLabel.backgroundColor = UIColor.green
} else {
networkIndicatorLabel.text = "Not Available"
networkIndicatorLabel.backgroundColor = UIColor.red
}

window.layoutIfNeeded()
UIView.animate(withDuration: 0.5, delay: 0.0, usingSpringWithDamping: 1.0, initialSpringVelocity: 1.0, options: .curveEaseOut, animations: {
if (self.alertHidingConstraint?.isActive)! {
self.alertHidingConstraint?.isActive = false
}
if !(self.alertShowingConstraint?.isActive)! {
self.alertShowingConstraint?.isActive = true
}
window.layoutIfNeeded()
}, completion: { _ in
})
}

@objc func dismissNetworkAlerter() {
invalidateAndKillTimer()
guard let window = window else {
print("Some thing wrong with Window initialization!!")
return
}
window.layoutIfNeeded()
UIView.animate(withDuration: 0.5, animations: {
if (self.alertShowingConstraint?.isActive)! {
self.alertShowingConstraint?.isActive = false
}
if !(self.alertHidingConstraint?.isActive)! {
self.alertHidingConstraint?.isActive = true
}
window.layoutIfNeeded()
}) { (done) in
}
}

// MARK:- Timer Related
private func invalidateAndKillTimer() -> Void {
if (closeTimer != nil) {
closeTimer?.invalidate()
closeTimer = nil
}
}

然后移回 Base View Controller。在顶部复制粘贴以下内容

var networkAlertLauncher : NetworkAlerter? = nil

然后在 Base View Controller 中找到合适的位置并粘贴以下内容:

func showAlertBar(networkAvailabilityStatus: Bool) -> Void {
if networkAlertLauncher != nil {
networkAlertLauncher = nil
}

networkAlertLauncher = NetworkAlerter()
networkAlertLauncher?.showNetworkAlerter(networkAvailable: networkAvailabilityStatus)
}

现在,您从基础 View Controller 扩展的所有 View Controller 都可以访问函数 showAlertBar。您可以像这样调用它:self.showAlertBar(networkAvailabilityStatus: false)self.showAlertBar(networkAvailabilityStatus: true)

关于ios - FirstViewController 在另一个 SecondViewController 之上,其中 SecondViewController 是可点击的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53041982/

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