I'm using a CAShapeLayer
. I'm trying to make it so that its path changes whenever a mouse event occurs. For example, when a mouse down event occurs, a path is appended to a CGMutableRefPath
and then then the shape layer's path is set to it.
The problem: When I set the CAShapeLayer
path with a new path, the display is not updated with a new path unless I do . How do I tell the system that the shape layer's path has changed and to redraw itself?
Note: When I create a copy of the mutable path and pass it along, it works, but doing a copy every time is not performant and causes my computer to slow down when there are lots of paths.
CGMutablePathRef paths = CGPathCreateMutable();
CAShapeLayer *shapeLayer = [CAShapeLayer layer];
- (void)mouseDown:(NSEvent *)event {
CGPathAddEllipseInRect(paths, nil, rect);
self.shapeLayer.path = paths; // Works once, but subsequent calls do nothing
self.shapeLayer.path = CGPathCreateCopy(paths); // Works, but super slow
}
setPath:
sees that the pointer you're passing is the same as the one the property already has, and doesn't look to see if the path itself has changed (which would be expensive). Your work-around simply forces the action that would have occurred had you passed a different pointer. (Obviously,CAShapeLayer
is not copying the path, even if it's mutable, but also not updating automatically if that path is changed, which was my own question that led me to this post.) – Promisee