如何为 UIButton 保留图像的 tintColor?
How to keep image's tintColor for an UIButton?
我创建了自定义 class CircularButton
,我可以在其中为图像设置自定义 image
、backgroundColor
、tintColor
和 inset
到按钮的边缘。
它工作正常,除了 tintColor
。我希望能够设置 tintColor,但如果我不提供,它应该保留我图像的原始 tintColor(呈现为模板图像)。
open class CircularButton: UIButton {
public init(width: CGFloat, backgroundColor: UIColor? = nil, tintColor: UIColor? = nil, image: UIImage? = nil, contentMode: ContentMode? = nil, insets: UIEdgeInsets? = nil) {
super.init(frame: .zero)
self.backgroundColor = backgroundColor ?? .clear
self.tintColor = tintColor ?? // issue is here
self.imageEdgeInsets = insets ?? .zero
self.imageView?.contentMode = contentMode ?? .scaleAspectFit
setImage(image?.withRenderingMode(.alwaysTemplate), for: .normal)
if width != 0 {
widthAnchor.constraint(equalToConstant: width).isActive = true
}
heightAnchor.constraint(equalTo: widthAnchor).isActive = true
clipsToBounds = true
}
override open func layoutSubviews() {
super.layoutSubviews()
layer.cornerRadius = frame.width / 2
}
public required init?(coder aDecoder: NSCoder) {
fatalError()
}
}
这是我初始化它的方式:
let likeButton = CircularButton(width: 45, backgroundColor: #colorLiteral(red: 0, green: 0, blue: 0, alpha: 0.5), tintColor: .white, image: UIImage(named: "heart"), insets: .init(top: 5, left: 5, bottom: 5, right: 5))
这是有效的,除了如果我不想提供 tintColor,它会为按钮采用默认的蓝色 tintColor 并将我的图像呈现为蓝色。
这是我在我的习惯中尝试过的 class:
...
self.tintColor = tintColor ?? imageView?.tintColor
你在这里使用 .alwaysTemplate
作为 RenderingMode
是错误的,这个 属性 用于改变图像的颜色改变组件中 tint Color 的原始颜色,你如果你想在这个组件中保持图像的原始颜色,应该使用 .alwaysOriginal
要解决此问题,请在这一行中使用 .alwaysOriginal
而不是 .alwaysTemplate
setImage(image?.withRenderingMode(.alwaysTemplate), for: .normal)
我创建了自定义 class CircularButton
,我可以在其中为图像设置自定义 image
、backgroundColor
、tintColor
和 inset
到按钮的边缘。
它工作正常,除了 tintColor
。我希望能够设置 tintColor,但如果我不提供,它应该保留我图像的原始 tintColor(呈现为模板图像)。
open class CircularButton: UIButton {
public init(width: CGFloat, backgroundColor: UIColor? = nil, tintColor: UIColor? = nil, image: UIImage? = nil, contentMode: ContentMode? = nil, insets: UIEdgeInsets? = nil) {
super.init(frame: .zero)
self.backgroundColor = backgroundColor ?? .clear
self.tintColor = tintColor ?? // issue is here
self.imageEdgeInsets = insets ?? .zero
self.imageView?.contentMode = contentMode ?? .scaleAspectFit
setImage(image?.withRenderingMode(.alwaysTemplate), for: .normal)
if width != 0 {
widthAnchor.constraint(equalToConstant: width).isActive = true
}
heightAnchor.constraint(equalTo: widthAnchor).isActive = true
clipsToBounds = true
}
override open func layoutSubviews() {
super.layoutSubviews()
layer.cornerRadius = frame.width / 2
}
public required init?(coder aDecoder: NSCoder) {
fatalError()
}
}
这是我初始化它的方式:
let likeButton = CircularButton(width: 45, backgroundColor: #colorLiteral(red: 0, green: 0, blue: 0, alpha: 0.5), tintColor: .white, image: UIImage(named: "heart"), insets: .init(top: 5, left: 5, bottom: 5, right: 5))
这是有效的,除了如果我不想提供 tintColor,它会为按钮采用默认的蓝色 tintColor 并将我的图像呈现为蓝色。
这是我在我的习惯中尝试过的 class:
...
self.tintColor = tintColor ?? imageView?.tintColor
你在这里使用 .alwaysTemplate
作为 RenderingMode
是错误的,这个 属性 用于改变图像的颜色改变组件中 tint Color 的原始颜色,你如果你想在这个组件中保持图像的原始颜色,应该使用 .alwaysOriginal
要解决此问题,请在这一行中使用 .alwaysOriginal
而不是 .alwaysTemplate
setImage(image?.withRenderingMode(.alwaysTemplate), for: .normal)