【问题标题】:Custom Drawn UIButton自定义绘制的 UIButton
【发布时间】:2021-09-26 18:41:56
【问题描述】:

我需要一个在中间绘制自定义颜色的圆形 UIButton,以及一个作为默认色调绘制的外环(类似于 UIColorWell)。

我尝试了几种不同的方法:

  1. 使用多色 SFSymbol:这将是一个优雅的解决方案,但据我所知,在将中心设置为自定义颜色的同时,无法将色调颜色应用于图像的一部分。整个图像被着色,或者图像被绘制为符号文件中设置的默认颜色。此外,我需要支持 iOS 14,而 可能 允许我完成此任务的新分层选项已添加到 iOS 15。
  2. 设置各种图层属性(即cornerRadius、borderColor 等):这可行,可能是一个不错的后备解决方案,但我无法获得我想要的外观(即,在它们之间有一个透明环外边框和内彩色圆圈)。

如果有办法使用上述任一选项,请教我!任何一个似乎都是比以下更好的解决方案:

  1. 重载绘图功能:这是我目前要使用的选项,因为它允许我对按钮的外观进行完全的创造性控制。本文的其余部分将介绍此方法。

到目前为止,我能够完全按照我的意愿绘制按钮。但是,我无法弄清楚如何根据各种状态更改适当地绘制按钮。

例如,如果显示弹出框,则所有普通按钮都会自动重绘为禁用状态。但是,我的自定义按钮没有重绘,因此我无法响应状态更改。

点击按钮也是如此 - 普通按钮会以强调的颜色短暂显示,但我的自定义按钮没有响应。

有人有关于如何支持覆盖各种状态的 UIButton 绘图的示例吗?

【问题讨论】:

  • 如何设置它的setImage(for:)setBackgroundImage(for:) 并用绘制的图像填充它?如果您不进行任何其他自定义操作,则实际上无需对其进行子类化...否则,可能使用 KVO(如果可能),或者只是覆盖其 state 属性,您可能会反映重绘?
  • 我尝试过绘制图像,然后在按钮上设置图像。不幸的是,除非使用模板图像,否则我不会自动重新着色,因此仍然需要知道状态何时发生变化。我还尝试过重载 UIButton 中的各种状态属性(即 isEnabled),但除非实际设置了状态(即,不是在显示弹出框时),否则不会调用这些属性。在这一点上,我不得不重新思考我的设计,因为我看不到获得我想要的东西的方法。

标签: ios swift uikit


【解决方案1】:

我能够通过覆盖tintColorDidChange 来获得所需的行为,以触发按钮的重绘。现在我能够以正确的颜色绘制外环(包括在显示弹出框时变灰),同时保持所需的内部颜色。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-25
    • 2011-08-10
    • 2011-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多