Cocoa 更改路径时不更新CAShapeLayer

Cocoa 更改路径时不更新CAShapeLayer,cocoa,calayer,cashapelayer,Cocoa,Calayer,Cashapelayer,我使用的是CAShapeLayer。我试图使其路径在鼠标事件发生时改变。例如,当发生鼠标按下事件时,将路径附加到CGMutableRefPath中,然后将形状层的路径设置为该路径 问题:当我用新路径设置CAShapeLayer路径时,除非我这样做,否则显示不会用新路径更新。如何告知系统形状层的路径已更改,并重新绘制自身 注意:当我创建可变路径的副本并传递它时,它可以工作,但是每次复制都不起作用,并且当有很多路径时,会导致我的计算机速度减慢 CGMutablePathRef paths = CGP

我使用的是
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
}

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

更新路径后,调用


或者两者都可以。

调用
[self.shapeLayer didChangeValueForKey:@“path”]
强制层重新绘制自身。

谢谢,但我尝试在形状层上调用
setNeedsDisplay
setNeedsLayout
,但没有效果。我很确定我的路径都是有效的。它们都是R=50的圆,但起源不同。工作原理是创建路径的副本并设置它。示例:
self.shapeLayer.path=CGPathCreateCopy(路径)。但是,随着时间的推移进行复制会导致我的计算机陷入困境。我已经找到了答案。我必须调用
[self.shapeLayer didChangeValueForKey:@“path”]
来重新渲染层本身。不过,感谢您的帮助。如果它帮助mark处于正确位置(选中标记)-它将帮助您在将来更快地获得答案。啊,听起来像
setPath:
看到您传递的指针与属性已经具有的指针相同,而不查看路径本身是否已更改(这将非常昂贵)。如果您传递了另一个指针,您的工作只是强制执行可能发生的操作。(显然,
CAShapeLayer
并没有复制路径,即使路径是可变的,但也不会在路径改变时自动更新,这是我自己的问题,也是我写这篇文章的原因。)
 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);