这篇文章有很好的解释和演示,但简而言之,tint是一种使用您选择的颜色突出显示交互元素的简单方法。
它还与UIImage一起使用,将其renderingMode
属性设置为UIImageRenderingModeAlwaysTemplate
或(在某些情况下,如选项卡中的图像)UIImageRenderingModeAutomatic
来给图像上色。我猜当某些图像变成蓝色时,这就是您遇到的问题,因为这是默认应用程序tintColor
。
Swift 5
色调颜色可以被视为用于没有自己颜色的图像的颜色。当图像以“模板”形式呈现时,可以看到它们没有自己的颜色,如渲染模式所示。这是因为当图像作为模板呈现时,它们的颜色值被忽略,其 alpha 值设置为 0,并用色调颜色替换。
例如,假设您将系统图像设置为按钮:
let button = UIButton(frame: CGRect(origin: CGPoint(x: self.view.bounds.midX, y: self.view.bounds.midY), size: .init(width: 200, height: 200)))
let image = UIImage(systemName: "trash")
button.setImage(image, for: .normal)
self.view.addSubview(button)
self.view.tintColor = .red
假设您可以将此符号的 alpha 值设置为 1,这将用其原始颜色替换着色颜色,或者通过使用 withRenderingMode(_:) 强制将符号呈现为 .alwaysOriginal
:
let image = UIImage(systemName: "trash")?.withRenderingMode(UIImage.RenderingMode.alwaysOriginal)
正如我所提到的,色调颜色是继承的,这意味着您不必设置每个视图的色调颜色。您可以更改UIWindow
的色调颜色或在界面生成器的文件检查器中更改全局色调:
最后,如果您想让资产目录中的自定义图像作为模板呈现,您可以在资产目录的属性检查器中设置呈现模式:
颜色着色是应用程序或UIView的“默认”或“回退”颜色。苹果公司指出,“它是层次结构中第一个非默认颜色。UIView的所有子类都从基类派生其tintColor行为。”因此,如果您向项目添加新的视图控制器,它的颜色着色为蓝色,则当您在此视图中添加按钮时,此按钮的标题文本也将是蓝色的。这是因为按钮的tintcolor将从主视图(其tint color为蓝色)继承。更改主要视图的tint color也会改变其子视图的标题颜色。
UIView
的 backgroundColor
属性设置视图的背景颜色。该属性影响整个视图的背景,并用于为视图内绘制的内容提供背景颜色。
另一方面,UIView
的 tintColor
属性用于设置视图中包含的任何可点击元素或控件的颜色。这包括按钮、分段控件和其他类似的 UI 元素。当选择元素或状态更改时,例如在选择表格行时的勾选标记的颜色,也会使用 tintColor
进行着色。
总之,backgroundColor
影响整个视图的背景颜色,而 tintColor
影响视图内任何可点击元素或控件的颜色。