更改多个CAShapeLayers的绘制顺序

时间:2017-01-19 04:21:13

标签: swift macos cocoa native

我的程序绘制了几个不同的CGMutablePaths,每个CGMutablePaths都属于自己的CAShapeLayer。 It currently looks like this

注意矩形的线条如何与圆圈重叠。 Here is how I want it to look

基本上,我希望椭圆和它们的填充在矩形线的顶部绘制。

在我的代码中,我有一个CAShapeLayers数组,第一个是矩形。在awakeFromNib()中,我循环遍历所有形状图层并更新笔画宽度和填充等信息,然后手动将矩形的填充颜色更改为不同。在绘图功能中,我创建所有路径,首先是矩形,然后是椭圆。最后,我将这些路径添加到它们的相对形状图层,矩形后面的椭圆。

我尝试过在每种情况下交换订单,但没有运气。老实说,我无法想到任何可能影响订单的事情。关于它的最奇怪的部分是,在第一张图片中,你会看到左下方的椭圆确实被绘制在矩形上方,但在我的代码中没有任何地方被分开。

var shapeLayers: [String: CAShapeLayer] = [
    "rectangle": CAShapeLayer(),
    "ellipse1": CAShapeLayer(),
    "ellipse2": CAShapeLayer()...and so on
]

override func awakeFromNib() {
    wantsLayer = true

    for (_, shapeLayer) in shapeLayers {
        shapeLayer.lineWidth = borderWidth
        shapeLayer.strokeColor = ColorScheme.blue.cgColor
        shapeLayer.fillColor = ColorScheme.white.cgColor
        shapeLayer.path = nil
        shapeLayer.lineCap = kCALineCapSquare
        layer?.addSublayer(shapeLayer)
    }

    shapeLayers["rectangle"]?.fillColor = NSColor.clear.cgColor
}

override func draw(_ dirtyRect: NSRect) {
    let rectangle = CGMutablePath().addRect(selectionBounds)
    let ellipse1 = CGMutablePath().addEllipse(in: CGRect(origin: somePoint, size: someSize))
    let ellipse2 = CGMutablePath().addEllipse(in: CGRect(origin: somePoint, size: someSize))
    ...and so on

    shapeLayers["rectangle"]?.path = rectangle
    shapeLayers["ellipse1"]?.path = ellipse1
    shapeLayers["ellipse2"]?.path = ellipse2...and so on
}

我在理解shapeLayers和path时明显遗漏了一些基本内容。非常感谢您的帮助 - TIA

1 个答案:

答案 0 :(得分:0)

您可以使用zPosition强制图层按特定顺序绘制。只要数字从后层升到前层,就可以为它们分配任意值。