【问题标题】:How do I turn off the blue overlay on the image I'm using with my UIButton?如何关闭与 UIButton 一起使用的图像上的蓝色叠加层?
【发布时间】:2020-07-20 09:34:53
【问题描述】:

所以,我是一个相对较新的编码人员,并且知道这可能是一个非常简单的解决方法,但我似乎无法找到任何地方的方法,只是人们知道它会发生。也有可能我误解了其他一些核心思想,这就是为什么我似乎无法修复。

我在我的故事板中设置了一个 UIKit 按钮,在我的脚本中为这个按钮添加了一个 IBAction 和 IBOutlet(类?无论在项目中调用单个 .swift 文件),将 IBO 设置为从 UIButton 继承,都在 ViewController 类中。在 viewDidLoad 函数中我有

button.setImage(UIImage (named: "logo"), for: .normal)

以及与 UILabel 相关的另一行编码器(那里一切都很好)。在 viewDidLoad 函数下方,我有一个数组,然后是 IBA,其中包含一些代码,可以对数组进行洗牌并在屏幕上吐出 0 索引点。

我这几天一直在尝试解决这个问题,假设我已经理解了我读过的所有内容,我了解到 UIImages 是不可变的(无法更改),所以这告诉我我需要在 viewDidLoad 中声明它时解决这个问题。我还了解到,在当前的 swift/xcode 状态下,它是默认的蓝色,这是一个渲染模式问题,只需将其关闭即可解决问题。我一辈子都无法将最后几个点联系起来,弄清楚如何真正告诉 Xcode 简单地使用我提供的图像。

当然,我正在寻找一种代码解决方案,但是如果我知道它为什么会起作用,以及对我认为我所学内容的任何更正/澄清,我将更加感激,这样我将来可以更多地帮助自己。

提前谢谢你。 -赛尔

【问题讨论】:

  • 更多代码会有所帮助。 UIImage 也是不可变的,但您可以使用新的 UIImage 对象更改按钮的图像。
  • 您是否将 Storyboard 中的按钮类型从系统更改为自定义?
  • 我没有,下面的回复让我知道了这一点以及另一种选择。就更多代码而言,到目前为止已经有 13 行代码,其中包括导入 UIKit 之类的内容。大声笑,下次我有问题时,我会确保提供更多代码。在这种情况下,我认为上下文就足够了,我很抱歉。

标签: ios swift xcode uibutton uikit


【解决方案1】:

由于您没有指定,我假设按钮的“类型”在情节提要中设置为“系统”(在情节提要中拖出新的UIButton 时的默认按钮类型)。

默认情况下,系统按钮采用任何设置在其上的图像并对其应用模板渲染模式,这使得图像将所有非透明像素渲染为平面颜色(例如,在这种情况下按钮的色调颜色,即默认情况下是您看到的系统蓝色)。

UIImages 默认具有renderingModeautomatic,这意味着图像采用的实际有效渲染模式取决于使用图像的任何内容(在本例中为UIButton)。

但是,您可以使用 alwaysOriginalrenderingMode 实例化 UIImage,这样它就不会被视为模板图像。有几种方法可以做到这一点。

1。以编程方式

您可以通过获取您已经创建的图像,在代码中使用新的渲染模式创建一个新的图像对象:

UIImage(named: "logo")

并在其上调用 withRenderingMode(_:) 以返回给您一个新的 UIImage 对象,然后您将其设置在您的按钮上:

let logoImage = UIImage(named: "logo")
let logoImageAlwaysOriginal = logoImage?.withRenderingMode(.alwaysOriginal)
button.setImage(logoImageAlwaysOriginal, for: .normal)

2。资产目录

比采用上述程序化路线更简单的方法是在资产目录中更改图像的默认渲染类型。在资产目录中单击要更改的图像(在本例中为“徽标”),然后转到 Attributes Inspector(键盘快捷键:option+command+4),并将“Render As”属性更改为“Original Image ”。现在,无论何时您从资产目录(在您的故事板或代码中)使用或获取此图像,该图像将具有.alwaysOriginal 的渲染模式。


您可以执行上述任何选项并保留系统按钮类型,或者您可以在情节提要中将按钮的类型更改为“自定义”,因为自定义按钮应用模板默认情况下为其图像呈现模式。但是,当不使用系统按钮类型时,您会失去一些好东西,例如文本颜色不再取自按钮的色调颜色,并且按钮在未按下时没有漂亮的淡入淡出动画。

【讨论】:

  • 这一切都非常有帮助。太感谢了。当我实现这些想法时,我只是修改了声明的 UIImage 而不是第二个。做第二个是好习惯吗?我问是因为它只是让我的徽标常量具有该渲染模式修饰符,但我想知道我是否应该养成声明各种基础然后在接下来的几行中制作修改版本的习惯。
  • 没有问题!当您说您修改了声明的UIImage 时,实际上您没有 修改它(请记住,UIImages 是不可变的)。当您在其上调用withRenderingMode(_:) 时发生的情况是,它正在创建一个new,次要的UIImage – 一个具有您指定的呈现模式。所以,你做的方式和我做的方式本质上是一样的。我只是把它分成多行以便于阅读,但是你肯定可以在没有局部变量的情况下在一行中完成所有操作,例如:button.setImage(UIImage(named: "logo")?.withRenderingMode(.alwaysOriginal), for: .normal)
  • 哦,还有,我记得还有另一种(更简单的)方法可以更改图像的渲染模式。我会用这种额外的方式更新我的答案。
猜你喜欢
  • 2012-12-16
  • 1970-01-01
  • 1970-01-01
  • 2022-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-09
相关资源
最近更新 更多