2012-07-12 81 views
2

我要平滑的手指触摸画线曲线,我想在UIBezierPath解决方案仅我的代码不平滑这里行completely.my代码是UIBezierPath平滑曲线手指触摸绘图

@implementation MyLineDrawingView 
@synthesize undoSteps; 

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     // Initialization code 

     [super setBackgroundColor:[UIColor whiteColor]]; 

     pathArray=[[NSMutableArray alloc]init]; 
     bufferArray=[[NSMutableArray alloc]init]; 



    } 
    return self; 
} 


// Only override drawRect: if you perform custom drawing. 
// An empty implementation adversely affects performance during animation. 
- (void)drawRect:(CGRect)rect 
{ 

    [[UIColor blackColor] setStroke]; 
    for (UIBezierPath *_path in pathArray) 
    [_path strokeWithBlendMode:kCGBlendModeNormal alpha:1.0];  
} 
#pragma mark - Touch Methods 
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    [bufferArray removeAllObjects]; 
    myPath=[[UIBezierPath alloc]init]; 
    myPath.lineWidth=5; 
    myPath.miterLimit=-10; 
    myPath.lineCapStyle = kCGLineCapRound; 
    myPath.flatness = 0.0; 


    UITouch *mytouch=[[touches allObjects] objectAtIndex:0]; 
    [myPath moveToPoint:[mytouch locationInView:self]]; 
    [pathArray addObject:myPath]; 

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

    UITouch *mytouch=[[touches allObjects] objectAtIndex:0]; 
    [myPath addLineToPoint:[mytouch locationInView:self]]; 
    [self setNeedsDisplay]; 

} 

-(void)undoButtonClicked 
{ 
    if([pathArray count]>0) 
    { 
    UIBezierPath *_path=[pathArray lastObject]; 
    [bufferArray addObject:_path]; 
    [pathArray removeLastObject]; 
    [self setNeedsDisplay]; 
    } 

} 
-(void)redoButtonClicked 
{ 
    if([bufferArray count]>0){ 
     UIBezierPath *_path=[bufferArray lastObject]; 
     [pathArray addObject:_path]; 
     [bufferArray removeLastObject]; 
     [self setNeedsDisplay]; 
    } 
} 
- (void)dealloc 
{ 
    [pathArray release]; 
    [bufferArray release]; 
    [super dealloc]; 
} 

@end 

,我使用获得输出我的代码像下面的屏幕截图:

enter image description here

我要像下面的屏幕截图平滑曲线输出:

enter image description here

任何人都可以帮助我非常感谢!

在此先感谢!

回答

4

问题是,您只是使用addLineToPoint:向路径添加点。这相当于创建一系列直线。您确实需要添加控制点,例如在Illustrator或Sketch中绘制曲线路径时可能拖动的手柄。

您可以使用addCurveToPoint:controlPoint1:controlPoint2:添加这些;技巧是找出控制点的位置,相对于您从touches*事件中实际获得的点数。

对于可能的技术的一个很好的讨论,我推荐以下问题:Drawing Smooth Curves - Methods Needed