ズームインしたときに動かしたタッチでスムーズに線を描画しようとすると、いくつかの問題が発生します。問題UIView
は、特定のズームレベルで線が非常にピクセル化されて見えるようになることです。これは概念実証のようなものなので、私のビュー階層は今のところ本当に単純です。私は子供の頃UIScrollView
、UIView
ズームビューとして設定されています。
私の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
パスを描画するために使用する回避策を見つけることができました。ただし、パフォーマンスの低下は許容できませんでした。
誰かが私に正しいアプローチを教えてくれたら本当にありがたいです。
ありがとう。