0

ズームインしたときに動かしたタッチでスムーズに線を描画しようとすると、いくつかの問題が発生します。問題UIViewは、特定のズームレベルで線が非常にピクセル化されて見えるようになることです。これは概念実証のようなものなので、私のビュー階層は今のところ本当に単純です。私は子供の頃UIScrollViewUIViewズームビューとして設定されています。

私のdrawRect:実装は次のようになります。

CGContextRef context = UIGraphicsGetCurrentContext();

[self.layer renderInContext:context];

CGPoint mid1 = midPoint(_previousPoint1, _previousPoint2);
CGPoint mid2 = midPoint(_currentPoint, _previousPoint1);

CGContextSetBlendMode(context, kCGBlendModeNormal);
CGContextMoveToPoint(context, mid1.x, mid1.y);
CGContextAddQuadCurveToPoint(context, _previousPoint1.x, _previousPoint1.y, mid2.x, mid2.y);
CGContextSetLineCap(context, kCGLineCapRound);
CGContextSetLineJoin(context, kCGLineJoinRound);
CGContextSetLineWidth(context, self.lineWidth);
CGContextSetStrokeColorWithColor(context, self.lineColor.CGColor);
CGContextStrokePath(context);

_previousPoint1レイヤーのコンテンツをコンテキストにダンプすることは重要な部分です。これは、最後の3つのタッチポイント( 、、_previousPoint2および)によって形成されるパスを囲むバウンディングボックスのみを更新するためです_currentPoint。その操作は実際にはtouchesMovedメソッドで実行され、それを処理する関数は次のとおりです。

- (void)calculateMinImageArea:(CGPoint)pp1 :(CGPoint)pp2 :(CGPoint)cp
{
    // calculate mid point
    CGPoint mid1    = midPoint(pp1, pp2);
    CGPoint mid2    = midPoint(cp, pp1);

    CGMutablePathRef path = CGPathCreateMutable();
    CGPathMoveToPoint(path, NULL, mid1.x, mid1.y);
    CGPathAddQuadCurveToPoint(path, NULL, pp1.x, pp1.y, mid2.x, mid2.y);
    CGRect bounds = CGPathGetBoundingBox(path);
    CGPathRelease(path);

    CGRect drawBox = [self extendedRect:bounds];

    UIGraphicsBeginImageContext(drawBox.size);
    [self.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIGraphicsEndImageContext();

    [self setNeedsDisplayInRect:drawBox];
}

CAShapeLayersパスを描画するために使用する回避策を見つけることができました。ただし、パフォーマンスの低下は許容できませんでした。

誰かが私に正しいアプローチを教えてくれたら本当にありがたいです。

ありがとう。

4

1 に答える 1

1
[self setContentScaleFactor:scale];

これをscrollViewDidEndZooming:デリゲート メソッドで使用する

これがあなたの助けになることを願っています

于 2013-01-17T11:16:00.590 に答える