CALayer:如何调用绘制函数



我已经对CALayer进行了子类化以创建径向梯度(我从这里开始这段代码(。问题是我需要更改渐变的颜色,这是在绘制函数中。我希望每次更改图层时都能重新绘制图层colors.我不能直接打电话给draw(in:),因为我不知道该用什么CGContext。有什么想法吗?

import Foundation
import UIKit
class CARadialGradientLayer: CALayer {
    required override init() {
        super.init()
        needsDisplayOnBoundsChange = true
    }
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }
    required override init(layer: Any) {
        super.init(layer: layer)
    }
    public var colors = [UIColor(red: 0.2, green: 0.2, blue: 0.2, alpha: 0.5).cgColor, UIColor(red: 0.2, green: 0.2, blue: 0.2, alpha: 0.00).cgColor] {
        didSet {

            /* Redraw the layer to update colors */

        }
    }
    override func draw(in ctx: CGContext) {
        ctx.saveGState()
        let colorSpace = CGColorSpaceCreateDeviceRGB()
        var locations = [CGFloat]()
        for i in 0...colors.endIndex {
            locations.append(CGFloat(i) / CGFloat(colors.count))
        }
        let gradient = CGGradient(colorsSpace: colorSpace, colors: colors as CFArray, locations: locations)
        let center = CGPoint(x: bounds.width / 2.0, y: bounds.height / 2.0)
        let radius = min(bounds.width / 2.0, bounds.height / 2.0)
        ctx.drawRadialGradient(gradient!, startCenter: center, startRadius: 0.0, endCenter: center, endRadius: radius, options: CGGradientDrawingOptions(rawValue: 0))
    }
}

didSet中,调用 setNeedsDisplay()

当绘画发生时,这不是由你决定的。系统会处理这个问题。但是,您可以告诉系统何时需要绘图。

最新更新