UIAlertController前景在不应该变暗时变暗

时间:2017-03-29 07:56:28

标签: ios iphone swift uialertcontroller

我有一个奇怪的问题影响了我的应用程序中显示的所有UIAlertController - AlertControllers'白色前景显得暗淡或不太明亮。

描述它的最简单方法是通过将相关代码放入新的“测试”中来说明我获得的预期效果和预期效果。单视图应用程序(Swift 3 - 我应该注意到实际应用程序是使用Swift 2.3的单视图应用程序。)

在我的测试'应用程序,下面的代码使用不推荐的AlertView来显示示例消息,然后构建一个AlertController并立即显示'在'之后。除了突出显示前景中的对比度之外,不需要使用AlertView' white' - 如果我注释掉AlertView,问题行为是一样的。

有问题的行为: 4 images comparing alertcontroller in Test app vs real app

图1:测试应用程序:显示AlertView,然后AlertController显示在它后面。请注意AlertView前景的白度/亮度。

图2:测试应用程序:当AlertView被解除时,AlertController是最上面的视图控制器,正如所期望的那样,它的前景亮度与之前的AlertView完全相同

图片3:真正的应用程序:相同的代码,也位于viewDidAppear中 - 显示的AlertView具有预期的白度/亮度

图片4:真正的应用程序:当AlertView被解散时,AlertController然后是最上面的,但它的前景远不及AlertView的那么明亮/白色,或者像在测试应用示例中那样, image 2。

如前所述,即使我取消了AlertView步骤(仅用于对比),行为也是一样的。

进一步的观察 - 通常当我观察行为时,只是在受影响的AlertController首次出现时,例如可能是1/4或1/8秒,其前景是正确的白度/亮度,但随后是根据陈述的问题,它瞬间变暗。

另一个观察结果 - 真实应用程序中的一些AlertControllers正确显示正确的亮度级别,但许多其他人没有。

最后一个观察 - 我有用户查看UI层次结构'在Xcode中,似乎没有任何东西在'之上。受影响的AlertController。

import UIKit

class ViewController: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
}


override func viewDidAppear(_ animated: Bool) {


    UIAlertView(title: "My AlertView Title", message: "My AlertView Message", delegate: self, cancelButtonTitle: "OK").show()

    let alertTitle = "My AlertController Title"
    let msg = "\r\r\r\r\r\r\r\rMy AlertController Msg"

    let alertController = UIAlertController(title: alertTitle, message: msg, preferredStyle: .alert)

    let cancelAction = UIAlertAction(title: "Don't show this again", style: .cancel) { (action:UIAlertAction!) in
        print("Dismiss button pressed")

    }
    alertController.addAction(cancelAction)

    let OKAction = UIAlertAction(title: "Action 1", style: .default) { (action:UIAlertAction!) in

        print("I'm action1!!")
    }

    alertController.addAction(OKAction)

    let OK2Action = UIAlertAction(title: "Action2", style: .default) { (action:UIAlertAction!) in

        print("I'm action2")
    }

    alertController.addAction(OK2Action)

    present(alertController, animated: false, completion: nil)


}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

}

对于这个难题感到非常感谢,谢谢!

编辑:

感谢@Richard G让我走上了正确的轨道 - 我仍然有问题,但更清晰。

所以,你看看下面的两个截图,它们都来自真实的应用程序,都使用上面显示的代码生成UIAlertController(我现在已经删除了UIAlertView行,因为它不是&t; t需要),左边一个和右边一个的唯一区别是右边的那个有这三行代码添加:

let backView = alertController.view.subviews.last?.subviews.last 
backView?.layer.cornerRadius = 10.0 
backView?.backgroundColor = UIColor.whiteColor()  

side by side UIAlertControllers 1 transparent 1 not

根据Apple," UIAlert Controller类旨在按原样使用,不支持子类化。此类的视图层次结构是私有的,不得修改。"好吧,所以这是黑客攻击它,它证明了alertController在显示它之前已经获得了一个部分透明的backgroundColor。

通过将backgroundColor设置为UIColor.whiteColor(),问题得到解决,但解决方案应该是不必要的 - 首先问题是如何产生的?

当Apple甚至没有向我公开该属性以便能够设置时,backgroundColor如何设置为具有透明度?

感激地收到任何答案!

2 个答案:

答案 0 :(得分:1)

看到你上传的图片后,我可以提一点。

  • 如果您注意到,UIAlertController有点透明。

  • 由于UIAlertController是透明的,因此背景会影响警报控制器的外观。

注意:在案例1& 2背景是白色和案例3& 4背景是黑色。

所以你能做到的就是让背景像案例1和案例2一样明亮(来自图像)。

**编辑:**

更改UIAlertController的背景颜色,你可以这样做......

let subView = alertController.view.subviews.first!;
var alertContentView = subView.subviews.first!;
alertContentView.backgroundColor = UIColor.darkGray;
alertContentView.layer.cornerRadius = 5;

答案 1 :(得分:0)

UIAlertView和UIAlertController具有相同的背景颜色和alpha值。 但是在你的情况下,AlertView显示在AlertController上面,即为什么UIAlertView比UIAlertController更像是Whitier。