2012-06-18 25 views
2

我已经使用uigraphics cgcontext画线触摸...但我的线不光滑我的意思是边缘不光滑,所以任何人都可以建议我如何绘制流畅的线.. ?? 这里我的代码是我用来画线:如何在目标c中顺畅地绘制自由手线?

/* touchesBegan */ 
UITouch *touch = [touches anyObject]; 
lastPoint = [touch locationInView:imagevw]; 

/* touchesMoved */ 

CGFloat width = [mySlider value]; 
UIGraphicsBeginImageContext(imagevw.frame.size); 
[imagevw.image drawInRect:CGRectMake(0, 0, imagevw.frame.size.width,imagevw.frame.size.height)]; 
CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound); 
CGContextSetLineWidth(UIGraphicsGetCurrentContext(), width); 
UITouch *touch = [touches anyObject]; 
mouseSwiped = YES; 
    CGPoint currentPoint = [touch locationInView:imagevw]; 
    CGContextBeginPath(UIGraphicsGetCurrentContext()); 
    CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y); 
    CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), currentPoint.x, currentPoint.y); 
    CGContextStrokePath(UIGraphicsGetCurrentContext()); 
    imagevw.image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
lastPoint = currentPoint; 





/* touchesEnded */ 
/* same here */ 
CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y); 
     CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y);` 

这是我的代码,我可以画线放手,但它不是平滑的显示像素我的意思是边缘不光滑

回答

4

该代码张贴京都完美的作品。您可以阅读问题here

CGPoint midPoint(CGPoint p1, CGPoint p2) 
{ 

    return CGPointMake((p1.x + p2.x) * 0.5, (p1.y + p2.y) * 0.5); 

} 

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 

    UITouch *touch = [touches anyObject]; 

    previousPoint1 = [touch previousLocationInView:self]; 
    previousPoint2 = [touch previousLocationInView:self]; 
    currentPoint = [touch locationInView:self]; 

} 

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 

    UITouch *touch = [touches anyObject]; 

    previousPoint2 = previousPoint1; 
    previousPoint1 = [touch previousLocationInView:self]; 
    currentPoint = [touch locationInView:self]; 


    // calculate mid point 
    CGPoint mid1 = midPoint(previousPoint1, previousPoint2); 
    CGPoint mid2 = midPoint(currentPoint, previousPoint1); 

    UIGraphicsBeginImageContext(self.imageView.frame.size); 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    [self.imageView.image drawInRect:CGRectMake(0, 0, self.imageView.frame.size.width, self.imageView.frame.size.height)]; 

    CGContextMoveToPoint(context, mid1.x, mid1.y); 
    // Use QuadCurve is the key 
    CGContextAddQuadCurveToPoint(context, previousPoint1.x, previousPoint1.y, mid2.x, mid2.y); 

    CGContextSetLineCap(context, kCGLineCapRound); 
    CGContextSetLineWidth(context, 2.0); 
    CGContextSetRGBStrokeColor(context, 1.0, 0.0, 0.0, 1.0); 
    CGContextStrokePath(context); 

    self.imageView.image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

} 
+0

我已经试过这仍然这不是光滑....如果你知道任何其他可以请你寄给我,如果任何示例代码将是非常有益的。感谢advanc .. –

0

不流畅而平滑使用点..你应该使用NSBeziePath ...

花了3000线,但很流畅,“竹子”的工具。

正确的做法是使用贝塞尔路径:

  • 记录每个图纸
  • 用于对视图
  • 有效地吸引你应该计算在飞锚点贝塞尔路径,并同时追踪(你不会画出事件的触点)
  • 你甚至可以记录并保存它。
1
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = [touches anyObject]; 
    pointCurrent = [touch locationInView:self.view]; 
} 

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = [touches anyObject]; 
    CGPoint pointNext = [touch locationInView:self.view]; 
    UIGraphicsBeginImageContext(img.frame.size); 
    [img.image drawInRect:CGRectMake(0, 0, img.frame.size.width, img.frame.size.height)]; 
    CGContextSetLineWidth(UIGraphicsGetCurrentContext(), 2.0); 
    CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), 1.0, 0.0, 0.0, 1.0); 
    CGContextMoveToPoint(UIGraphicsGetCurrentContext(), pointCurrent.x, pointCurrent.y); 
    CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), pointNext.x, pointNext.y); 
    CGContextStrokePath(UIGraphicsGetCurrentContext()); 
    img.image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    pointCurrent = pointNext; 
}