美文网首页
2021-02-26 关于UIAlertController在i

2021-02-26 关于UIAlertController在i

作者: 牛牛大王奥利给 | 来源:发表于2021-02-26 17:29 被阅读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.

    相关文章

      网友评论

          本文标题:2021-02-26 关于UIAlertController在i

          本文链接:https://www.haomeiwen.com/subject/fjjmfltx.html