2013-01-17 30 views
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
[self setContentScaleFactor:scale]; 

使用這scrollViewDidEndZooming:委託方法

希望這有助於的你

+0

這絕對好像是去了,但我遇到了一些問題的方式: 1.當我結束放大,只繪製最後三個觸摸點形成的路徑。剩下的就會丟失,就像圖層的內容沒有被轉儲到當前的圖形上下文中一樣。 2.如果我在放大視圖的情況下進行繪製,屏幕不會在移動的接觸上刷新,我只能看到我繪製的內容在觸摸結束(路徑不看像素,所以這是好東西!) 任何想法可能會導致這種影響? – mdonati

+0

什麼是您的最大zoomScale? – MadhuP

+0

它是5和最小值,如果它很重要,是0.5 – mdonati