1

角丸四角形を描画する次のコードがあります。

void ContextAddRoundedRect(CGContextRef ctx, CGRect rect, CGFloat radius) {
    CGFloat minX = CGRectGetMinX(rect);
    CGFloat maxX = CGRectGetMaxX(rect);
    CGFloat minY = CGRectGetMinY(rect);
    CGFloat maxY = CGRectGetMaxY(rect);

    CGContextMoveToPoint(ctx, minX + radius, minY);
    CGContextAddArcToPoint(ctx, maxX, minY, maxX, minY + radius, radius);
    CGContextAddArcToPoint(ctx, maxX, maxY, maxX - radius, maxY, radius);
    CGContextAddArcToPoint(ctx, minX, maxY, minX, maxY - radius, radius);
    CGContextAddArcToPoint(ctx, minX, minY, minX + radius, minY, radius);
}

それを変換してCGMutablePathRef、図面に a を使用できるようにします-[UIBezierPath containsPoint:](コメントで+bezierPathWithCGPath:指定されているように、最初に使用して、ここで回答します)。

CGMutablePathRefCGContext を直接描画するのではなく、使用することの深刻な/既知の欠点はありますか? 私の推測では、それはスターターではありませんが、何かが欠けている可能性があります。

(解放しなければならないことはわかっている)

4

3 に答える 3

3

使用するだけ+[UIBezierPath bezierPathWithRoundedRect:cornerRadius:]で、すべての手間を省くことができます。本当に必要な場合は、プロパティCGPathRefを取得してください。CGPath

これを 1 秒間に何千回も実行しない限り、著しく遅くなったり、大量のメモリを消費したりすることはほとんどありません。

于 2013-01-13T02:16:40.993 に答える
1

私には大丈夫なアプローチのようです...多分あなたはそれをどうにかしてキャッシュすることさえできますか?*つまり、パスを毎回やり直すのではなく、長方形または半径が変更された場合にのみやり直します。

もちろん、可変パスの方がメモリフットプリントが大きくなりますが、この場合は無視できるはずです。


例えば:

UIBezierPath *pathWithRoundedRect(NSRect rect, CGFloat radius) {
    CGMutablePathRef path;
    ...

    id p = [UIBezierPath bezierPathWithCGPath:path];
    CGPathRelease(path);
    return p;

}

于 2013-01-13T00:06:37.107 に答える
1

いいえ、CGContext内部パスがあり、CGContext描画する関数は、内部で同等の関数を呼び出しているだけCGMutablePathです。CGMutablePath を自分で作成しない理由はありません。パス関数CGContextは便利です。

を使用してパスを描画しない場合は、CGContextを作成することをお勧めしますCGMutablePath

于 2013-09-28T09:42:09.633 に答える