更改路径时CAShapeLayer不会更新

时间:2013-08-02 20:20:03

标签: cocoa calayer cashapelayer

我正在使用CAShapeLayer。我试图使它的路径在鼠标事件发生时改变。例如,当发生鼠标按下事件时,会将路径附加到CGMutableRefPath,然后将形状图层的路径设置为它。

问题:当我使用新路径设置CAShapeLayer路径时,除非我这样做,否则不会使用新路径更新显示。如何告诉系统形状图层的路径已更改并重绘自己?

注意:当我创建可变路径的副本并将其传递时,它可以正常工作,但每次执行复制都不具备效果,并且当有很多路径时导致计算机速度变慢。

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
}

2 个答案:

答案 0 :(得分:6)

调用[self.shapeLayer didChangeValueForKey:@"path"]强制图层重绘自己。

答案 1 :(得分:1)

确保你的路径是有效的,即它有有效的顶点和填充等。例如(这只是一个200 X 200矩形填充颜色的例子,你可以使用自己的):

 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);

更新路径后,请致电

[shapeLayer setNeedsDisplay]

[shapeLayer setNeedsLayout]

或两者兼而有之。