I have the function Track.getShadowPath()
that is returning a CGMutablePath
.
Function returning CGMutablePath
static func getShadowPath() -> CGMutablePath{
let trackPath = CGMutablePath()
let initPoint = Track.tracks.first?.initPoint
let heigthShift = CGPoint(x: 0, y: 100)
trackPath.move(to: initPoint! - heigthShift)
var yShift = CGPoint(x: 0, y: 0)
for track:Track in Track.tracks{
let q = track.getQuadrant()
if(q == 2 || q == 5){
yShift.y = yShift.y + track.endPoint.y - track.initPoint.y
}
else {
trackPath.addLine(to: track.endPoint - heigthShift - yShift)
}
}
return trackPath
}
This path is then added to a CAShapeLayer
and the layer added to my view as a sublayer. I want this path to have a shadow aspect. But when it renders, it produces a shadow as if the path was closed. How can I achieve my purpose?
NSView
class DemoView: NSView {
var trackShape:CAShapeLayer!
var trackShadowShape:CAShapeLayer!
override init(frame: CGRect){
super.init(frame: frame)
trackShape = CAShapeLayer()
trackShape.strokeColor = NSColor.black.cgColor
trackShape.lineWidth = 3
trackShape.lineJoin = kCALineJoinBevel
trackShape.lineCap = kCALineCapRound
trackShape.fillColor = nil
trackShadowShape = CAShapeLayer()
trackShadowShape.lineWidth = 14
trackShadowShape.lineJoin = kCALineJoinBevel
trackShadowShape.lineCap = kCALineCapRound
trackShadowShape.fillColor = nil
trackShadowShape.shadowColor = NSColor.blue.cgColor
trackShadowShape.shadowRadius = 10
self.layer?.addSublayer(trackShadowShape)
self.layer?.addSublayer(trackShape)
}
func redrawTrack(){
trackShape.path = Track.getCompletePath()
trackShadowShape.shadowPath = Track.getShadowPath()
trackShadowShape.shadowRadius = 20
trackShadowShape.shadowOpacity = 1
trackShadowShape.fillColor = NSColor.clear.cgColor
trackShadowShape.lineWidth = 10
}
}
The non-expected result