UIAlertController不会将背景中的所有元素都变为黑白

时间:2018-10-22 15:03:14

标签: swift xcode uialertcontroller

编辑:我的解决方案存储库:UIAlertControllerDimmed


在显示UIAlertController后,大多数背景变暗,并变成黑白。有些元素会变暗,但不能变成黑白。

这些元素是(从屏幕截图的顶部到底部):

  • UINavigationItem内的UIImageView
  • 具有红色背景色和白色图像的UIButton
  • UITabBarItem内的UIImageView

with alert controller

我找不到与此主题相关的任何内容。我还需要更改以使这些项目变暗吗?

这是没有UIAlertController的:

without alert controller]

3 个答案:

答案 0 :(得分:3)

我认为这是在设置某些元素的tintColor,并且tintColor的行为与backgroundColor或{{1 }}(或图像中的颜色)。

  

当出现警报或操作表时,iOS 7会自动将   后面视图的色彩。为了响应这种颜色变化,   在其呈现中使用tintColor的自定义视图子类应   覆盖tintColorDidChange以在适当时刷新呈现。

例如,我创建了一个显示警报控制器的简单应用。我将左按钮的颜色设置为清除颜色,将文本颜色设置为蓝色:

enter image description here

我将右键按钮的颜色设置为系统绿色:

enter image description here

当我运行该应用并显示警报控制器时,它看起来像这样

之前:

enter image description here

之后:

enter image description here

为了获得您想要的行为,您需要遵循@Alexander答案中的建议。您需要在屏幕上创建这四个图像的灰度版本,并为过渡到它们制作动画。

答案 1 :(得分:2)

您可以使用辅助功能来为颜色变化设置动画

fileprivate func dimElements(highlight: Bool) {
    UIView.animate(withDuration: 0.3) {
        self.sendButton.backgroundColor = highlight ? .red : .gray
    }
}

,然后在显示/关闭警报时调用它。

let alert = UIAlertController(title: "Error", message: "Oops!", preferredStyle: .alert)
let okAction = UIAlertAction(title: "Ok", style: .cancel, handler: {_ in self.dimElements(highlight: true) })
alert.addAction(okAction)
self.dimElements(highlight: false)
present(alert, animated: true, completion: nil)

答案 2 :(得分:1)

谢谢您的帮助。

为了拥有更灵活的解决方案,我决定创建UIAlertController的子类来捕获屏幕快照,将其转换为灰度颜色,并在显示时将其插入UIAlertController的后面。这样,它就可以工作而无需执行任何其他工作,并且您不需要为默认情况下不会变为灰度颜色的每个元素实现淡入淡出动画。

Github repo: UIAlertControllerDimmed