在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];
}
这是我想要实现的图像,假设有五个视图,我想绘制从第一个视图到第二个,第三个等的连续线...同时我想在每个视图绘制曲线在线。
答案 0 :(得分:1)
您的代码已经构建了一系列点。
现在您需要修改drawRect方法以在所有点之间绘制线段,而不仅仅是最新的点。
如果您从细分线中构建UIBezierPath
并一次性绘制,则可能会获得更好的效果。
这样的结果将是连续的一系列近似于曲线的短线段。如果用户快速移动他的手指,则线段将更长,使得曲线看起来更不稳定。
一旦你开始工作,就可以使用一些技术来平滑生成的曲线。 Erica Sadun出色的“核心iOS开发人员的烹饪书”有一个名为“Smoothing”的食谱,涵盖了这个主题。它完全符合您的要求 - 由用户进行徒手绘制并使其平滑。
我在Github上有几个使用Erica Sadun的线条平滑技术的项目。
项目KeyframeViewAnimations绘制一条曲线,通过一组预定义的点。
项目“RandomBlobs”绘制一条闭合曲线,该曲线是多边形的平滑版本。
其中包括Sadun博士的曲线平滑代码,但同样,她书中的章节最适合您的需求。