【问题标题】:CAShapeLayer not updating when changing path更改路径时 CAShapeLayer 不更新
【发布时间】:2013-08-02 20:20:02
【问题描述】:

我正在使用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
}

【问题讨论】:

    标签: cocoa calayer cashapelayer


    【解决方案1】:

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

    【讨论】:

    • 啊,听起来像 setPath: 看到您传递的指针与属性已有的指针相同,并且不查看路径本身是否已更改(这将贵)。如果您传递了不同的指针,您的解决方法只是强制执行会发生的操作。 (显然,CAShapeLayer 不会复制路径,即使它是可变的,但如果路径发生更改也不会自动更新,这是我自己的问题导致我写这篇文章。)
    【解决方案2】:

    确保您的路径是有效的,即它具有有效的顶点和填充等。例如(这只是一个用颜色填充的 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]

    或两者兼而有之。

    【讨论】:

    • 谢谢,但我试过在形状层上调用setNeedsDisplay和setNeedsLayout,但没有效果。很确定我的路径都是有效的。它们都是 R=50 的圆,但起源不同。起作用的是创建路径的副本并对其进行设置。示例:self.shapeLayer.path = CGPathCreateCopy(paths);。但是随着时间的推移进行复制会导致我的计算机陷入困境。
    • 想通了。我不得不打电话给[self.shapeLayer didChangeValueForKey:@"path"] 来让图层重新渲染自己。不过感谢您的帮助。
    • 如果它帮助标记在正确的位置(复选标记)-它将帮助您在未来更快地获得答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-26
    • 2023-02-03
    • 1970-01-01
    • 2023-03-10
    • 2016-05-27
    相关资源
    最近更新 更多