【发布时间】:2021-09-26 18:41:56
【问题描述】:
我需要一个在中间绘制自定义颜色的圆形 UIButton,以及一个作为默认色调绘制的外环(类似于 UIColorWell)。
我尝试了几种不同的方法:
- 使用多色 SFSymbol:这将是一个优雅的解决方案,但据我所知,在将中心设置为自定义颜色的同时,无法将色调颜色应用于图像的一部分。整个图像被着色,或者图像被绘制为符号文件中设置的默认颜色。此外,我需要支持 iOS 14,而 可能 允许我完成此任务的新分层选项已添加到 iOS 15。
- 设置各种图层属性(即cornerRadius、borderColor 等):这可行,可能是一个不错的后备解决方案,但我无法获得我想要的外观(即,在它们之间有一个透明环外边框和内彩色圆圈)。
如果有办法使用上述任一选项,请教我!任何一个似乎都是比以下更好的解决方案:
- 重载绘图功能:这是我目前要使用的选项,因为它允许我对按钮的外观进行完全的创造性控制。本文的其余部分将介绍此方法。
到目前为止,我能够完全按照我的意愿绘制按钮。但是,我无法弄清楚如何根据各种状态更改适当地绘制按钮。
例如,如果显示弹出框,则所有普通按钮都会自动重绘为禁用状态。但是,我的自定义按钮没有重绘,因此我无法响应状态更改。
点击按钮也是如此 - 普通按钮会以强调的颜色短暂显示,但我的自定义按钮没有响应。
有人有关于如何支持覆盖各种状态的 UIButton 绘图的示例吗?
【问题讨论】:
-
如何设置它的
setImage(for:)或setBackgroundImage(for:)并用绘制的图像填充它?如果您不进行任何其他自定义操作,则实际上无需对其进行子类化...否则,可能使用 KVO(如果可能),或者只是覆盖其state属性,您可能会反映重绘? -
我尝试过绘制图像,然后在按钮上设置图像。不幸的是,除非使用模板图像,否则我不会自动重新着色,因此仍然需要知道状态何时发生变化。我还尝试过重载 UIButton 中的各种状态属性(即 isEnabled),但除非实际设置了状态(即,不是在显示弹出框时),否则不会调用这些属性。在这一点上,我不得不重新思考我的设计,因为我看不到获得我想要的东西的方法。