0
我在嘗試在我的UIView
放大時移動的觸摸上平滑地繪製線條時遇到一些問題。問題是線條開始在特定縮放級別看起來非常像素化。 我的視圖層次結構現在非常簡單,因爲這更像是一個概念驗證。我有一個UIScrollView
,我的UIView
作爲一個孩子,它也被設置爲縮放視圖。在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
繪製路徑的解決方法。但是,低性能是不可接受的。
我真的很感激,如果有人能指出我正確的做法。
謝謝。
這絕對好像是去了,但我遇到了一些問題的方式: 1.當我結束放大,只繪製最後三個觸摸點形成的路徑。剩下的就會丟失,就像圖層的內容沒有被轉儲到當前的圖形上下文中一樣。 2.如果我在放大視圖的情況下進行繪製,屏幕不會在移動的接觸上刷新,我只能看到我繪製的內容在觸摸結束(路徑不看像素,所以這是好東西!) 任何想法可能會導致這種影響? – mdonati
什麼是您的最大zoomScale? – MadhuP
它是5和最小值,如果它很重要,是0.5 – mdonati