如何关闭我在 UIButton 上使用的图像上的蓝色叠加层?
How do I turn off the blue overlay on the image I'm using with my UIButton?
所以,我是一个相对较新的编码员,我知道这可能是一个真正简单的修复,但我似乎无法找到任何地方,只是人们知道它发生了。也有可能我误解了其他一些核心思想,这就是为什么我似乎无法解决的原因。
我在故事板中设置了一个 UIKit 按钮,在我的脚本中为该按钮添加了 IBAction 和 IBOutlet(class?无论单个 .swift 文件在project),设置IBO继承自UIButton,全部在ViewControllerclass。在 viewDidLoad 函数中我有
button.setImage(UIImage (named: "logo"), for: .normal)
和另一行与 UILabel 有关的编码器(那里一切都很好)。在 viewDidLoad 函数下方,我有一个数组,然后是带有一些代码的 IBA,该代码会打乱数组并在屏幕上吐出 0 个索引点。
几天来我一直在努力解决这个问题,假设我已经理解了我读过的所有内容,我了解到 UIImages 是不可变的(无法更改)所以这告诉我我需要在 viewDidLoad 中声明它时修复它。我还了解到,在当前 swift/xcode 状态下默认为蓝色,这是渲染模式问题,只需将其关闭即可解决问题。我一辈子都无法连接最后几个点并弄清楚如何真正告诉 Xcode 简单地使用我提供的图像。
当然,我正在寻找代码解决方案,但是了解它为什么会起作用以及任何 corrections/clarifications 我认为我学到的知识将更加受欢迎,这样我可以更多地帮助自己在将来。
提前谢谢你。
-赛尔
由于您没有指定,我假设按钮的 "Type" 在故事板中设置为 "System"(拖出新的 UIButton
时的默认按钮类型)在故事板中)。
默认情况下,系统按钮采用其上设置的任何图像并对其应用模板渲染模式,这使得图像将所有非透明像素渲染为纯色(例如,在这种情况下按钮的色调颜色,默认情况下是您看到的系统蓝色)。
UIImage
s 默认有一个 renderingMode
of automatic
,这意味着图像采用的实际有效渲染模式由使用图像的任何人决定(在这种情况下,UIButton
).
但是,您可以用 alwaysOriginal
的 renderingMode
实例化 UIImage
,这样它就永远不会被视为模板图像。有几种方法可以做到这一点。
1。以编程方式
您可以使用您已经创建的图像在代码中创建一个具有新渲染模式的新图像对象:
UIImage(named: "logo")
并在其上调用 withRenderingMode(_:)
以 return 为您提供一个新的 UIImage
对象,然后您在按钮上设置该对象:
let logoImage = UIImage(named: "logo")
let logoImageAlwaysOriginal = logoImage?.withRenderingMode(.alwaysOriginal)
button.setImage(logoImageAlwaysOriginal, for: .normal)
2。资产目录
比上面的编程路线更简单的方法是只更改资产目录中图像的默认渲染类型。在资产目录中单击要更改的图像(在本例中为 "logo"),然后转到属性检查器(键盘快捷键:option+command+4),并将 "Render As" 属性更改为"Original Image"。现在,无论何时(无论是在故事板还是代码中)使用或从资产目录中获取此图像,图像都将具有 .alwaysOriginal
.
的渲染模式
您可以执行上述任何选项并保留系统按钮类型,或者您可以在情节提要中将按钮类型更改为 "Custom",因为自定义按钮 不是 默认情况下将模板渲染模式应用于他们的图像。但是,当不使用系统按钮类型时,您会失去一些不错的东西,例如文本颜色不再取自按钮的色调,并且按钮在未按下时没有漂亮的淡入淡出动画。
所以,我是一个相对较新的编码员,我知道这可能是一个真正简单的修复,但我似乎无法找到任何地方,只是人们知道它发生了。也有可能我误解了其他一些核心思想,这就是为什么我似乎无法解决的原因。
我在故事板中设置了一个 UIKit 按钮,在我的脚本中为该按钮添加了 IBAction 和 IBOutlet(class?无论单个 .swift 文件在project),设置IBO继承自UIButton,全部在ViewControllerclass。在 viewDidLoad 函数中我有
button.setImage(UIImage (named: "logo"), for: .normal)
和另一行与 UILabel 有关的编码器(那里一切都很好)。在 viewDidLoad 函数下方,我有一个数组,然后是带有一些代码的 IBA,该代码会打乱数组并在屏幕上吐出 0 个索引点。
几天来我一直在努力解决这个问题,假设我已经理解了我读过的所有内容,我了解到 UIImages 是不可变的(无法更改)所以这告诉我我需要在 viewDidLoad 中声明它时修复它。我还了解到,在当前 swift/xcode 状态下默认为蓝色,这是渲染模式问题,只需将其关闭即可解决问题。我一辈子都无法连接最后几个点并弄清楚如何真正告诉 Xcode 简单地使用我提供的图像。
当然,我正在寻找代码解决方案,但是了解它为什么会起作用以及任何 corrections/clarifications 我认为我学到的知识将更加受欢迎,这样我可以更多地帮助自己在将来。
提前谢谢你。 -赛尔
由于您没有指定,我假设按钮的 "Type" 在故事板中设置为 "System"(拖出新的 UIButton
时的默认按钮类型)在故事板中)。
默认情况下,系统按钮采用其上设置的任何图像并对其应用模板渲染模式,这使得图像将所有非透明像素渲染为纯色(例如,在这种情况下按钮的色调颜色,默认情况下是您看到的系统蓝色)。
UIImage
s 默认有一个 renderingMode
of automatic
,这意味着图像采用的实际有效渲染模式由使用图像的任何人决定(在这种情况下,UIButton
).
但是,您可以用 alwaysOriginal
的 renderingMode
实例化 UIImage
,这样它就永远不会被视为模板图像。有几种方法可以做到这一点。
1。以编程方式
您可以使用您已经创建的图像在代码中创建一个具有新渲染模式的新图像对象:
UIImage(named: "logo")
并在其上调用 withRenderingMode(_:)
以 return 为您提供一个新的 UIImage
对象,然后您在按钮上设置该对象:
let logoImage = UIImage(named: "logo")
let logoImageAlwaysOriginal = logoImage?.withRenderingMode(.alwaysOriginal)
button.setImage(logoImageAlwaysOriginal, for: .normal)
2。资产目录
比上面的编程路线更简单的方法是只更改资产目录中图像的默认渲染类型。在资产目录中单击要更改的图像(在本例中为 "logo"),然后转到属性检查器(键盘快捷键:option+command+4),并将 "Render As" 属性更改为"Original Image"。现在,无论何时(无论是在故事板还是代码中)使用或从资产目录中获取此图像,图像都将具有 .alwaysOriginal
.
您可以执行上述任何选项并保留系统按钮类型,或者您可以在情节提要中将按钮类型更改为 "Custom",因为自定义按钮 不是 默认情况下将模板渲染模式应用于他们的图像。但是,当不使用系统按钮类型时,您会失去一些不错的东西,例如文本颜色不再取自按钮的色调,并且按钮在未按下时没有漂亮的淡入淡出动画。