如何在核心图形ios中连续绘制曲线

时间:2016-12-28 12:34:36

标签: ios objective-c drawing core-graphics

在iOS应用程序中,我想连续绘制曲线,如下图所示。这是我的代码,但它只绘制了一条直线。

- (void)drawRect:(CGRect)rect{
    CGContextRef context = UIGraphicsGetCurrentContext();

    // set the line properties
    CGContextSetStrokeColorWithColor(context, [UIColor redColor].CGColor);
    CGContextSetLineCap(context, kCGLineCapRound);
    CGContextSetLineWidth(context, 30);
    CGContextSetAlpha(context, 0.6);

    // draw the line
    CGContextMoveToPoint(context, startPoint.x, startPoint.y);
    CGContextAddLineToPoint(context, endPoint.x, endPoint.y);
    CGContextStrokePath(context);
}
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    UITouch *touch = [touches anyObject];
    CGPoint current = [touch locationInView:self];
    startPoint=current;
    arrPoints=[[NSMutableArray alloc]init];
    [arrPoints addObject:NSStringFromCGPoint(startPoint)];
}

-(void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    UITouch *touch = [touches anyObject];
    CGPoint p = [touch locationInView:self];

    endPoint=p;
    [arrPoints addObject:NSStringFromCGPoint(endPoint)];
    [self setNeedsDisplay];
}

-(void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    [self touchesMoved:touches withEvent:event];
}

这是我想要实现的图像,假设有五个视图,我想绘制从第一个视图到第二个,第三个等的连续线...同时我想在每个视图绘制曲线在线。

enter image description here

1 个答案:

答案 0 :(得分:1)

您的代码已经构建了一系列点。

现在您需要修改drawRect方法以在所有点之间绘制线段,而不仅仅是最新的点。

如果您从细分线中构建UIBezierPath并一次性绘制,则可能会获得更好的效果。

这样的结果将是连续的一系列近似于曲线的短线段。如果用户快速移动他的手指,则线段将更长,使得曲线看起来更不稳定。

一旦你开始工作,就可以使用一些技术来平滑生成的曲线。 Erica Sadun出色的“核心iOS开发人员的烹饪书”有一个名为“Smoothing”的食谱,涵盖了这个主题。它完全符合您的要求 - 由用户进行徒手绘制并使其平滑。

我在Github上有几个使用Erica Sadun的线条平滑技术的项目。

项目KeyframeViewAnimations绘制一条曲线,通过一组预定义的点。

项目“RandomBlobs”绘制一条闭合曲线,该曲线是多边形的平滑版本。

其中包括Sadun博士的曲线平滑代码,但同样,她书中的章节最适合您的需求。