如何在Swift中用draw(_ rect:CGRect)绘制一个不同的混合模式的UILabel

所以我有一个UILabel正在绘制的梯度图像(这是一个UIImageView )的顶部。 它看起来像这样:

在这里输入图像说明

我试图在UILabeldraw(_ rect: CGRect)函数中更改graphics上下文的blendMode ,以便绘制标签,但是使用softLight混合模式与背景混合。

这是我想要的样子:

在这里输入图像说明

这里是我在draw(_ rect: CGRect)函数中的代码:

 override func draw(_ rect: CGRect) { // Drawing code if let context = UIGraphicsGetCurrentContext() { context.setBlendMode(.softLight) self.textColor.set() self.drawText(in: rect) } } 

此代码只呈现顶部图片而不是混合版本。 这并不是我所尝试过的,我尝试了很多其他的东西,但是我不明白CGContextdraw函数。

在SO上的大多数答案要么在旧的Objective-C中,并且被弃用/破坏或者太快和太复杂(例如使用Metal)。 我只想在上下文中绘制文本,并将上下文的混合模式设置为柔和光线。 必须有一个简单的方法!

任何帮助如何解决这个将不胜感激。 谢谢!

你不能以这种方式混合观点; 他们有单独解决的层次结构。 在CALayer对象上移动渐变和文本,并将它们混合(或在同一视图中手工绘制)。 例如:

 class MyView: UIView { let gradientLayer: CAGradientLayer = { let gradientLayer = CAGradientLayer() gradientLayer.colors = [UIColor.red.cgColor, UIColor.blue.cgColor] gradientLayer.startPoint = CGPoint(x: 0, y: 0) gradientLayer.endPoint = CGPoint(x: 1, y: 1) return gradientLayer }() let textLayer: CATextLayer = { let textLayer = CATextLayer() let astring = NSAttributedString(string: "Text Example", attributes: [.font: UIFont(name: "MarkerFelt-Wide", size: 60)!]) textLayer.string = astring textLayer.alignmentMode = kCAAlignmentCenter textLayer.bounds = astring.boundingRect(with: CGSize(width: .max, height: .max), options: [.usesLineFragmentOrigin, .usesFontLeading], context: nil) return textLayer }() override func draw(_ rect: CGRect) { if let context = UIGraphicsGetCurrentContext() { gradientLayer.bounds = bounds gradientLayer.render(in: context) context.saveGState() context.setBlendMode(.softLight) context.translateBy(x: center.x - textLayer.bounds.width / 2, y: center.y - textLayer.bounds.height / 2) textLayer.position = center textLayer.render(in: context) context.restoreGState() } } } 

在这里输入图像说明

所以如果你的文字真的是一个标签,你可以尝试改变普通标签的不透明度。 我假设你熟悉设置一个标签的alpha。 请在下面find一个设置标签alpha的例子:

 label.textColor = UIColor(red: 0.0, green: 0.0, blue: 0.0, alpha: 0.25) 

请给我一个提示,如果它不是一个标签 – 那么它应该更复杂。