我有一个导航ViewController,我想在用户关闭Internet时在所有ViewController上添加一个名为TestView
的自定义视图。当Internet连接状态更改时,我将自定义视图添加到keyWindow。当我按下ViewController时,视图将显示并停留在该位置,但是当我以模态显示ViewController时,模式ViewController会覆盖该视图。
我希望即使模态显示VC时视图也能保持在最前面,我希望能够在AppDelegate文件中为所有模态ViewController或类似的东西添加一些代码。如何在Swift 5中做到这一点?我在想,是否每次模态VC出现时都会触发一个函数,我可以在其中添加代码。这是我的AppDelegate当前的样子:
class AppDelegate: UIResponder, UIApplicationDelegate, ReachabilityObserverDelegate {
var reachability: Reachability?
var window: UIWindow?
var internetView: TestView?
//This is called when the internet connects or disconnects
func reachabilityChanged(_ isReachable: Bool) {
window = getKEYWindow()
if !isReachable {
window?.addSubview(internetView!)
}
else {
internetView?.removeFromSuperview()
}
}
func getKEYWindow() -> UIWindow? {
return UIApplication.shared.connectedScenes.filter({$0.activationState == .foregroundActive}).map({$0 as? UIWindowScene}).compactMap({$0}).first?.windows.filter({$0.isKeyWindow}).first
}
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
try? addReachabilityObserver()
internetView = TestView(frame: CGRect(x:0, y: 50, width: UIScreen.main.bounds.size.width, height: 14))
return true
}
}
Main ViewController:
Internet Turned Off:
Push ViewController:
Present ViewController Modally:
更新:我找到了另一种保持我的观点领先的方法。我在
internetView.layer.zPosition = .greatestFiniteMagnitude
中添加了以下行didFinishLaunchingWithOptions
,它像一个符咒一样工作。感谢大家的帮助。 最佳答案
我可以建议一种方法:
打开更高级别的新UIWindow并将其绘制在整个应用程序的顶部。
我不知道这是否是最好的方法,但是我只是在一个空的应用程序上使用以下代码对其进行了测试-似乎可行-甚至可以透明。
_myWindow = [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds];
[_myWindow makeKeyAndVisible];
UIViewController* dummyVC = [[UIViewController alloc] init];
dummyVC.view = [[UIView alloc]initWithFrame:_myWindow.bounds];
[dummyVC.view setOpaque:NO];
[dummyVC.view setAlpha:0.1f];
[_myWindow setRootViewController:dummyVC];
_myWindow.windowLevel = UIWindowLevelAlert + 1;
[_myWindow.rootViewController.view.layer setBackgroundColor:[UIColor greenColor].CGColor];