2017-01-19 34 views
0

我的程序绘制了几个不同的CGMutablePaths,每个CGMutablePath都属于它自己的CAShapeLayer。 It currently looks like this更改多个CAShapeLayers的绘制顺序

通知矩形的线如何重叠的圆圈。 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和路径。你的帮助是极大的赞赏 - TIA

回答

0

可以使用zPosition迫使层以特定的顺序绘制。只要数字从底层向顶层上升,只需指定它们的任意值即可。

+0

加入一个计数变量以awakeFromNib和在for循环递增它:shapeLayer.zPosition = CGFloat的(计数),并没有任何改变。然而,当我添加shapeLayers [“bounds”] ?. zPosition = -1后,它的作品。 –