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

时间:2017-10-21 16:51:30

标签: ios swift core-graphics cgcontext blending

所以我有一个UILabel正在渐变图像上绘制(即UIImageView)。它看起来像这样:

enter image description here

我正在尝试更改blendMode的{​​{1}}函数中图形上下文的UILabel,以便它绘制标签但与背景混合{{1混合模式。

这就是我想要的样子:

enter image description here

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

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) } } 函数。

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

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

2 个答案:

答案 0 :(得分:3)

你无法以这种方式混合视图;它们具有独立解析的单独层次结构。移动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()
        }
    }
}

enter image description here

答案 1 :(得分:0)

因此,如果你的文字真的是一个标签,你可以尝试改变不透明度,就像普通标签一样。我假设您熟悉为标签设置alpha。请在下面找到一个设置标签alpha的示例:

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

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