你可以使用层和面具做到这一点,但它实际上是更容易只设置与图案像的UIColor的文本颜色。这段代码有效,尽管子类UILabel可能会更好,并为该类提供了一种应用和/或更新图像的方法。我认为这很容易,因为我发现处理文本图层有点麻烦,因为标签可以通过adjustsFontSizeToFitWidth改变字体大小。
override func viewDidLayoutSubviews() {
label.textColor = UIColor(patternImage: partialGradient(forViewSize: label.frame.size, proportion: 0.65))
}
func partialGradient(forViewSize size: CGSize, proportion p: CGFloat) -> UIImage {
UIGraphicsBeginImageContextWithOptions(size, false, 0)
let context = UIGraphicsGetCurrentContext()
context?.setFillColor(UIColor.darkGray.cgColor)
context?.fill(CGRect(origin: .zero, size: size))
let c1 = UIColor.orange.cgColor
let c2 = UIColor.red.cgColor
let top = CGPoint(x: 0, y: size.height * (1.0 - p))
let bottom = CGPoint(x: 0, y: size.height)
let colorspace = CGColorSpaceCreateDeviceRGB()
if let gradient = CGGradient(colorsSpace: colorspace, colors: [c1, c2] as CFArray, locations: [0.0, 1.0]){
// change 0.0 above to 1-p if you want the top of the gradient orange
context?.drawLinearGradient(gradient, start: top, end: bottom, options: CGGradientDrawingOptions.drawsAfterEndLocation)
}
let img = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return img!
}