项目要求做新手引导,在引导的过程中可以点击跳过,然后弹窗提示。一开始只测试了iOS13之后的设备,代码如下:
let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
if okOnLeft == true {
alert.addAction(UIAlertAction(title: okActionTitle, style: .default, handler: okActionClick))
alert.addAction(UIAlertAction(title: cancelActionTitle, style: .default, handler: cancelActionClick))
} else {
alert.addAction(UIAlertAction(title: cancelActionTitle, style: .default, handler: cancelActionClick))
alert.addAction(UIAlertAction(title: okActionTitle, style: .default, handler: okActionClick))
}
viewController.present(alert, animated: true)
此方法在ios 13之后的设备上运行是没问题的,但是在iOS13之前,会被自定义的window遮盖住。于是本地看了下层级的变化,以及上网检索了下相关的问题。
层级图片展示:
WechatIMG186.jpeg
第一个进程是iOS12设备上的运行的代码调试,可见alterController的层级在guideView的下面,所以被覆盖了。
第二个是iOS13之后的,有两个UITransionView,这么调用,系统在第二个UITransionView上面添加了alterController。它在guideView层级的下面,所以显示出来是没问题的。
最后解决办法为创建一个新的window,调整下window的层级进行展示alterController,解决代码如下:
let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
if okOnLeft == true {
alert.addAction(UIAlertAction(title: okActionTitle, style: .default, handler: okActionClick))
alert.addAction(UIAlertAction(title: cancelActionTitle, style: .default, handler: cancelActionClick))
} else {
alert.addAction(UIAlertAction(title: cancelActionTitle, style: .default, handler: cancelActionClick))
alert.addAction(UIAlertAction(title: okActionTitle, style: .default, handler: okActionClick))
}
if #available(iOS 13, *) {
viewController.present(alert, animated: true)
}else{
let alertWindow = UIWindow(frame: UIScreen.main.bounds)
alertWindow.rootViewController = UIViewController()
alertWindow.windowLevel = UIWindow.Level(UIWindow.Level.alert.rawValue + 1)
alertWindow.makeKeyAndVisible()
alertWindow.rootViewController?.present(alert, animated: true)
}
}
这个是可以work的!
但是我看这个就有又想能不能都使用ios13之前的这个方法,我就试着只用这段代码进行展示:
let alertWindow = UIWindow(frame: UIScreen.main.bounds)
alertWindow.rootViewController = UIViewController()
alertWindow.windowLevel = UIWindow.Level(UIWindow.Level.alert.rawValue + 1)
alertWindow.makeKeyAndVisible()
alertWindow.rootViewController?.present(alert, animated: true)
发现在iOS13以上的设备上,该视图一闪而过,后来查询资料发现window在iOS13之后做了优化,出了作用域以后就直接被释放了。
以上为今日坑😹,又圆满了。
问题参考链接:
网友评论