5

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

问题:当我使用新路径设置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
}
4

2 回答 2

8

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

于 2013-08-03T11:52:20.763 回答
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]

或两者。

于 2013-08-02T20:23:38.257 回答