- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试创建出现在最顶部 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/
我正在尝试创建出现在最顶部 View Controller 上的通用警报,而底部 View Controller 仍然可以点击。此警报只是一个 20 点高的状态行,用于通知用户网络可达性。如何使 UI
我在按钮方法中有这段代码。 @IBAction func sendMsg(_ sender: UIButton) { DataforChat.arr2.append(enterMsg.text
正如标题所述,我无法将按钮拖动到我创建的 SecondViewController 中。 以下是我采取的所有步骤: 1) 进入编辑器 -> 嵌入 -> 导航 Controller 来创建一个新的导航
在评论我的项目之前,我是 Swift 的新手,正在努力学习。 在我的项目中,我有两个 View Controller ,将命名为 FirstViewController 和 SecondViewCon
我正在使用 Xcode 提供的模板制作 TabBarController 应用程序,每次单击它时我都需要重新加载第二个 View Controller 。我该怎么做? 谢谢 最佳答案 每当标签栏切换v
我目前正在开发一个应用程序,但遇到以下问题:我有我的主 VC (ReceiveInputVC),在我输入一个输入后,它会转到第二个 VC (TimeLeftVC ) 并使用从 mainVC 接收到的输
我第一次尝试构建一个分组的而不是简单的 tableView,但在点击单元格时显示的信息不正确时遇到了问题。 首先,我创建了一个数组,该数组用于为我的组提供标题。接下来我有一个数组,其中包含另外 4 个
如何在 viewDidLoad() 方法中与 ViewController 同时加载 SecondViewController ? Segue 的类型是 Sheet。 import Cocoa cla
prepareForSegue() 方法定义了 SecondViewController 的对象类型。然后,它访问 SecondViewController 类的数据成员并将“New View Con
我正在做一个练习,在 ViewController 中呈现一个 SecondViewController。 这就是我调用 View Controller 的方式。 - (void)viewDidApp
我有一个名为“Capital”的子类,它声明了变量,我想通过子类将这些变量通过 segue 推送到新的 SecondViewController 除了子类“Capital”,我还有 (2) 个 Vie
我正在尝试通过按下主视图 Controller 中的按钮将 JSON 值传输到另一个 View Controller 中的标签。我的第一个 View Controller 称为“ViewControl
经过多次尝试,我没有成功理解错误以及为什么图像没有出现...这是我的代码。 我的协议(protocol).h #import @protocol myProtocol -(UIImage *)tr
我在我的应用中构建了 Firebase 通知。它是成功的工作。但如果通知数据等于“第二”,我想打开,然后在我的应用程序中打开 SecondViewController。我能怎么做?我使用 userIn
我有两个 ViewController。我的第一个 View 有两个按钮(按钮 1 和按钮 2,每个按钮都使用 UIImageView 连接到第二个 View 。 我想要发生的是,当我按下按钮 1 时
我正在使用以下 Pod:https://github.com/xxxAIRINxxx/MusicPlayerTransition 。当我进行音乐播放器转换并关闭它时, Collection View
我正在我的 iOS 应用中实现 Admob 插页式 Admob 广告。我需要在从第二个 View Controller 到(主) View Controller 的转换之间显示广告。我将第二个 Vie
我有 TreeView Controller 。当 secondViewController 出现时,我尝试在这个时候呈现 thirdViewController 我想关闭 secondViewCon
这是我的代码,我正在尝试使用“prepareForSegue”函数将图像从 tableViewController (firstViewController) 发送到我的 detailedViewCo
FirstViewController 中的函数调用是 - @IBAction func redViewAct(sender :UIButton) { let nextview = s
我是一名优秀的程序员,十分优秀!