2021-02-26 关于UIAlertController在i

2021-02-26  本文已影响0人  牛牛大王奥利给

项目要求做新手引导,在引导的过程中可以点击跳过,然后弹窗提示。一开始只测试了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之后做了优化,出了作用域以后就直接被释放了。

以上为今日坑😹,又圆满了。

问题参考链接:

UIAlertController disappearing since iOS 13

UIAlertController is hidden behind the shadow.

上一篇下一篇

猜你喜欢

热点阅读