iOS 渐变色作用于字体的label

381 阅读1分钟
class GradientLabel : UIView{
    func setupText(text:String){
        self.textLayer.string = text
        self.maskTextLayer.string = text
    }
    func setupAttText(text:NSAttributedString){
        self.textLayer.string = text
        self.maskTextLayer.string = text
    }
    init(isSelected: Bool,fontSize : CGFloat,text: String,gradientLayer:CAGradientLayer,alignment : CATextLayerAlignmentMode = .left) {
        self.isSelected = isSelected
        self.textLayer = CATextLayer()
        self.textLayer.string = text
        self.textLayer.fontSize = fontSize
        self.textLayer.backgroundColor = UIColor.clear.cgColor
        self.textLayer.foregroundColor = UiuTheme.primaryText.cgColor
        self.textLayer.alignmentMode = .left
        self.textLayer.contentsScale = 2.0
        self.textLayer.isWrapped = **true**
        self.textLayer.alignmentMode = alignment
        self.gradientLayer = gradientLayer
        self.maskTextLayer = CATextLayer()
        self.maskTextLayer.string = text
        self.maskTextLayer.fontSize = fontSize
        self.maskTextLayer.backgroundColor = UIColor.clear.cgColor
        self.maskTextLayer.foregroundColor = UiuTheme.primaryText.cgColor
        self.maskTextLayer.alignmentMode = .left
        self.maskTextLayer.contentsScale = 2.0
        self.maskTextLayer.isWrapped = true
        self.maskTextLayer.alignmentMode = alignment
        self.gradientLayer.mask = self.maskTextLayer
        super.init(frame: .zero)
        self.backgroundColor = .clear
        self.layer.addSublayer(**self**.gradientLayer)
    }

    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    var textLayer : CATextLayer
    var maskTextLayer : CATextLayer
    var gradientLayer : CAGradientLayer
    var isSelected: Bool {
        didSet {
            if !isSelected{
                self.gradientLayer.removeFromSuperlayer()
                self.layer.addSublayer(**self**.textLayer)
            }else{
                self.textLayer.removeFromSuperlayer()
                self.layer.addSublayer(**self**.gradientLayer)
            }
        }
    }
    override func layoutSubviews() {
        super.layoutSubviews()
        self.textLayer.frame = self.bounds
        self.maskTextLayer.frame = self.bounds
        self.gradientLayer.shouldRasterize = true
        self.gradientLayer.frame = textLayer.bounds
    }

}

使用代码如下

let gradientLayer = CAGradientLayer()
    layer.colors = [
            UIColor(hexString: "#C400FF")!.cgColor,
            UIColor(hexString: "#4372FA")!.cgColor
        ]
        layer.startPoint = CGPoint(x: 0, y: 0.0)
        layer.endPoint = CGPoint(x: 1.0, y: 1.0)
let gradientLabel = GradientLabel(isSelected: true, fontSize: 15, text: "渐变色label", gradientLayer:gradientLayer)

可以通过gradientLabel.isSelected = false来设置不展示渐变色,gradientLabel.isSelected = true来展示渐变色, 支持通过setupAttText方法来设置NSAttributedString