我有一个奇怪的问题影响了我的应用程序中显示的所有UIAlertController - AlertControllers'白色前景显得暗淡或不太明亮。
描述它的最简单方法是通过将相关代码放入新的“测试”中来说明我获得的预期效果和预期效果。单视图应用程序(Swift 3 - 我应该注意到实际应用程序是使用Swift 2.3的单视图应用程序。)
在我的测试'应用程序,下面的代码使用不推荐的AlertView来显示示例消息,然后构建一个AlertController并立即显示'在'之后。除了突出显示前景中的对比度之外,不需要使用AlertView' white' - 如果我注释掉AlertView,问题行为是一样的。
图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如何设置为具有透明度?
感激地收到任何答案!
答案 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。