我在尝试在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
边界_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
用于绘制路径的解决方法。然而,低性能是不可接受的。
如果有人能指出正确的方法,我将不胜感激。
谢谢。