2017-01-19 51 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後,它的作品。 –