Swift UIAlertController不会将背景中的所有元素都转换为B/W

Swift UIAlertController不会将背景中的所有元素都转换为B/W,swift,xcode,uialertcontroller,Swift,Xcode,Uialertcontroller,编辑:使用我的解决方案的存储库: 在显示UIAlertController后,大部分背景变暗并变为黑白。有些元素会变暗,但不会变成黑白 这些元素(在屏幕截图上从上到下): UIAvigationItem内部的UIImageView 带有红色背景色和白色图像的UIButton UIAbbarItem内的UIImageView 我找不到任何与此主题相关的内容。我必须更改什么才能使这些项目变暗 以下是不带UIAlertController的示例: ]您可以使用一个助手函数来设置颜色更改的动画

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


在显示UIAlertController后,大部分背景变暗并变为黑白。有些元素会变暗,但不会变成黑白

这些元素(在屏幕截图上从上到下):

  • UIAvigationItem内部的UIImageView
  • 带有红色背景色和白色图像的UIButton
  • UIAbbarItem内的UIImageView

我找不到任何与此主题相关的内容。我必须更改什么才能使这些项目变暗

以下是不带UIAlertController的示例:


]

您可以使用一个助手函数来设置颜色更改的动画

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)

我认为这里发生的事情是,您正在设置某些元素的
tintColor
,并且
tintColor
的行为与
backgroundColor
textColor
(或图像中的颜色)不同

当警报或行动表出现时,iOS 7会自动使屏幕变暗 为其后面的视图着色。要响应此颜色变化,请使用 在渲染中使用tintColor的自定义视图子类应 覆盖tintColorDidChange以在适当时刷新渲染

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

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

当我运行应用程序并显示警报控制器时,它看起来是这样的

之前:

之后:


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

谢谢您的帮助

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


您确定这些ui元素不会变暗吗?因为它们是彩色的,所以看起来可能就是这样。试着用滴管工具检查RGB值(我建议)@toddg我可能说得那么糟糕。是的,它们会变暗一点,但不会像其他元素一样变成黑白。我编辑了我的标题。@toddg这是错误的,背景中的一些元素的颜色不是灰度的(比如“聊天”菜单项上方的通知气泡,它是红色的)。后面的消息视图也是红色的。好的,你的一个聊天泡泡从红色变为红色的事实不能从你的问题中推断出来。我坚持我的意见,
UIAlertController
的标准行为是应用透明的黑色遮罩。@toddg你的观点是什么?以上就是它所做的不止这些的证据。我不知道它还能做什么,我很乐意知道。我所能告诉你的是,我只是简单地介绍了
UIAlertController
。谢谢,但我想知道为什么它不能单独使用这些元素。它在不做任何其他事情的情况下为其他人工作(如“聊天”菜单项上方的通知气泡)。