用于手指触摸绘图的 UIBezierPath 平滑曲线

Posted

技术标签:

【中文标题】用于手指触摸绘图的 UIBezierPath 平滑曲线【英文标题】:UIBezierPath Smooth Curve for finger touch drawing 【发布时间】:2012-07-12 10:14:40 【问题描述】:

我想平滑手指触摸画线上的曲线,我希望 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

我正在使用我的代码获取输出,如下图所示:

我想要平滑的曲线输出,如下图所示:

谁能帮帮我,不胜感激!

提前致谢!

【问题讨论】:

【参考方案1】:

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

您可以使用addCurveToPoint:controlPoint1:controlPoint2: 添加这些;诀窍是确定控制点的放置位置,相对于您从touches* 事件中实际返回的点。

为了更好地讨论可能的技术,我推荐以下问题:Drawing Smooth Curves - Methods Needed。

【讨论】:

以上是关于用于手指触摸绘图的 UIBezierPath 平滑曲线的主要内容,如果未能解决你的问题,请参考以下文章

如何跟踪触摸时的手指运动以绘制平滑曲线?

使用触控板或触摸板的两根手指移动平滑和动态滚动?

在视图中绘制许多 UIBezierPath

iOS中最早的注册触摸事件

如何在 IOS/SWIFT/OBJ-C/CORDOVa 上获取手指 ID(哪个手指用于触摸 ID)或唯一触摸 ID

iPhone - 在屏幕上绘图以响应触摸事件