5

を使用してい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
}
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 に答える