代码之家  ›  专栏  ›  技术社区  ›  Jan Erik Schlorf DavidLio

uiAlertController不将背景中的所有元素都转换为b/w

  •  1
  • Jan Erik Schlorf DavidLio  · 技术社区  · 6 年前

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


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

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

    • uiAvigationItem内的uiImageView
    • 带有红色背景色和白色图像的uibutton
    • ui图像视图在uitabaritem内

    with alert controller

    我找不到与此主题相关的任何内容。我需要做些什么才能使这些项目变暗?

    以下是不带uiAlertController的:

    without alert controller ]

    3 回复  |  直到 6 年前
        1
  •  3
  •   toddg Stefan Steinegger    6 年前

    我想这里发生的事情是你把 tintColor 在一些元素中,你会得到不同的行为 淡色 比你做的还要多 backgroundColor textColor (或图像中的颜色)。

    出现警报或操作表时,iOS 7会自动调暗 它后面视图的淡色。为了响应这种颜色变化,a 在呈现中使用TintColor的自定义视图子类应 覆盖TintColorDidChange以在适当时刷新渲染。

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

    enter image description here

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

    enter image description here

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

    之前:

    enter image description here

    后:

    enter image description here

    为了获得你想要的行为,你需要遵循@alexander's answer中的建议。您将需要在屏幕上创建四个图像的灰度版本,并动画转换到它们。

        2
  •  2
  •   Alexander    6 年前

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

    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)
    
        3
  •  1
  •   Jan Erik Schlorf DavidLio    6 年前

    谢谢你的帮助。

    为了获得更灵活的解决方案,我决定创建 UIAlertController 它捕获屏幕截图,将其转换为灰度颜色并将其插入 ui警报控制器 当它出现的时候。这样,它就可以在不需要做任何额外工作的情况下工作,并且您不需要为默认情况下不变成灰度颜色的每个元素实现淡入淡出动画。

    Github repo: UIAlertControllerDimmed