Вопрос

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
}
Это было полезно?

Решение

Call [self.shapeLayer didChangeValueForKey:@"path"] to force the layer to redraw itself.

Другие советы

Make sure your path is a valid one i.e. it has valid vertices and fill etc. Such as (this is just an example of a 200 X 200 rect filled with color, you may use your own):

 CGContextRef context = UIGraphicsGetCurrentContext();
 CGContextAddPath(context, paths);
 CGPathAddRect(paths, NULL, CGRectMake(100.0, 100.0, 200.0, 200.0)); // generates a warning specified later
 CGContextFillPath(context);

After updating path, call

[shapeLayer setNeedsDisplay]

or

[shapeLayer setNeedsLayout]

or both.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top