【问题标题】:UIAlertController foreground is dimmed when it should not beUIAlertController 前景在不应该变暗时变暗
【发布时间】:2017-03-29 07:56:27
【问题描述】:

我有一个奇怪的问题,它影响了整个应用程序中显示的所有 UIAlertControllers - AlertControllers 的白色前景显得暗淡或不那么亮,而不是应该的。

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

在我的“测试”应用程序中,下面的代码使用已弃用的 AlertView 来显示示例消息,然后构建一个 AlertController 并在“之后”立即显示。除了突出显示前景“白色”中的对比度外,无需使用 AlertView - 如果我注释掉 AlertView,问题行为是相同的。

有问题的行为:

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

图 2:测试应用程序:当 AlertView 被关闭时,AlertController 是最上面的视图控制器,并且正如预期和期望的那样,它的前景亮度与 AlertView 之前的完全一样

图 3:真实应用:相同的代码,同样位于 viewDidAppear - AlertView 以预期的白度/亮度显示

图 4:真实应用:当 AlertView 被关闭时,AlertController 位于最上方,但其前景远不如 AlertView 的明亮/白色,或者与测试应用示例中的图像 2 一样。

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

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

另一个观察结果 - 实际应用中的一些 AlertController 以正确的亮度水平正确显示,但许多其他的却没有。

最后一个观察结果 - 我在 Xcode 中使用了“查看 UI 层次结构”,但受影响的 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 行,因为它不需要) , 左边和右边的唯一区别是右边添加了这3行代码:

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 设置为 UIColor.whiteColor() 问题得到解决,但解决方案应该是不必要的 - 问题最初是如何出现的?

当 Apple 甚至不向我公开该属性以使其能够设置时,backgroundColor 是如何以某种方式设置为具有透明度的?

感谢收到任何答案!

【问题讨论】:

  • 你错了,亮度是一样的,你只是有白色背景,给我们看看相同条件下的真实测试

标签: ios iphone swift uialertcontroller


【解决方案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;

【讨论】:

  • 谢谢,当我第一次阅读您的回复时,我无法检测到 UIAlertController 中的任何透明度,但是我随后通过在其后面的主 viewController 上放置了一个鲜红色的按钮进行了测试,果然你是对的,UIAlertController 中确实有一些透明度!现在我所要做的就是找出原因并解决它..
  • 所以,我很难弄清楚为什么当 UIAlertController 不在我的测试应用程序中时,它会在我的应用程序中呈现一些透明度:(1) 首先我认为它可能从 ViewController 中的其他视图继承透明度,因此将它们全部更改为 alpha 1,我还消除了代码中带有 alpha 组件的任何颜色设置
  • (2) 同时我已经确认我可以用一些代码覆盖透明度问题:let backView = yourAlertController.view.subviews.last?.subviews.lastbackView?.layer.cornerRadius = 10.0 backView?.backgroundColor = UIColor.whiteColor()
  • 再次感谢您,我实际上在其他地方找到了类似的代码,这确实解决了问题,就像您的一样,但是我的应用程序中有大量 UIAlertControllers,所以从我的角度来看,它有点一个笨拙/繁琐的解决方案 - 我很想了解为什么首先设置透明度以避免这种情况发生......
  • 所以 100% 以上的代码确认问题是由 UIAlertController 中的透明度引起的,然后我检查了 Xcode 界面中的图像视图层次结构,我注意到以下几点: - 我收到一条调试消息说“ 被要求为其不透明度设置动画。这将导致效果出现损坏,直到不透明度恢复为 1。"
【解决方案2】:

UIAlertView 和 UIAlertController 具有相同的背景颜色和 alpha 值。 但是在您的情况下,AlertView 显示在 AlertController 上方,即为什么感觉 UIAlertView 比 UIAlertController 更白。

【讨论】:

  • 嗨,谢谢,但事实并非如此,在图像 1,2 和 3 中,AlertView、AlertController 和 AlertView 分别是白色的,正如预期的那样 - 在图像 1 和 3 中,AlertController 位于AlertView,因此按预期变暗。出乎意料的是,换句话说,问题出在图 4 中的 AlertController,它应该与图像 1、2 和 3 中的 AlertView、AlertController 和 AlertView 一样白,但事实并非如此。应该与图 2 中的 AlertController 的白度相同,但不是……这就是问题所在。
  • 请参阅上面的答案,事实证明 UIAlertController 的 alpha 确实小于 1 - Apple 文档没有说明这可能是如何发生的,但这就是我需要找到的出去。在我随后的测试中,我继续观察到 UIAlertController 第一次出现时它是完全白色的背景,即 alpha 为 1,但过了几分之一秒,它变得有点透明,这就是问题所在,谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-17
  • 2017-11-10
  • 1970-01-01
相关资源
最近更新 更多