2

( )drawRectに格納されている描画中の形状があります。が呼び出されるたびに、シェイプは画面に合わせて引き伸ばされ、周囲にストロークの境界線が表示されます。ストロークの境界線を引き伸ばさずに描画するにはどうすればよいのでしょうか? つまり、 を伸ばしてから、その周りにストロークの境界線を描画して、描画するたびに同じ幅になるようにしますか? スケールの順序とパスの追加と描画を変更しようとしましたが、役に立ちませんでした。CGMutablePathRefshapeMutablePathdrawRectshapeMutablePath

- (void) drawRect:(CGRect)rect
{
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSaveGState(context);

    CGContextSetRGBFillColor(context, 1.0000, 1.0000, 1.0000, 1.0000);
    CGContextSetRGBStrokeColor(context,0.0000,0.0000,0.0000,1.0000);
    CGContextSetLineWidth(context, DialogueTextViewLineWidth);

    CGContextScaleCTM (context, self.frame.size.width / self.shapeMutablePathWidth, self.frame.size.height / self.shapeMutablePathHeight);
    CGContextAddPath(context, self.shapeMutablePath);
    CGContextDrawPath(context, kCGPathFillStroke);
    CGContextRestoreGState(context);    
}
4

1 に答える 1

2

CTM をスケーリングして元のパスを使用する代わりに:

CGContextScaleCTM (context, self.frame.size.width / self.shapeMutablePathWidth, self.frame.size.height / self.shapeMutablePathHeight);
CGContextAddPath(context, self.shapeMutablePath);

... 変換されたパスを作成し、代わりにそれを使用します。

CGAffineTransform trn = CGAffineTransformMakeScale(self.bounds.size.width / self.shapeMutablePathWidth, self.bounds.size.height / self.shapeMutablePathHeight);
CGPathRef transformedPath = CGPathCreateCopyByTransformingPath(self.shapeMutablePath, &trn);
CGContextAddPath(context, transformedPath);
CGPathRelease(transformedPath);

これにより、同じ(スケーリングされた)領域が塗りつぶされてストロークされますが、変換はストロークの幅には影響しません。

ところで、通常、フレームのサイズではなく、境界を使用してスケールを計算します。

于 2012-08-24T13:00:38.933 に答える