如何为 UIButton 保留图像的 tintColor?

How to keep image's tintColor for an UIButton?

我创建了自定义 class CircularButton,我可以在其中为图像设置自定义 imagebackgroundColortintColorinset 到按钮的边缘。

它工作正常,除了 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)