用我的手指在iOS中绘制贝塞尔曲线?

嘿,我试图找出如何在iOS中基于用户input生成贝塞尔曲线。 是否有任何现有的类? 有人能给我一个什么是需要的一般总结? 我只需要帮助开始右脚。

如果你想留在objective-c中,你可以使用UIBezierPath的addCurveToPoint:controlPoint1:controlPoint2:方法。 您也可以使用与CGPaths相似的命名函数。 当使用贝塞尔曲线时,需要4个点:起点,终点和每一端的控制点来定义曲线。

定义这种方法的一种方法是让用户拖动手指来定义开始点和结束点,然后点击控制点处的屏幕。 这是处理这个问题的示例视图。

BezierView.h

enum { BezierStateNone = 0, BezierStateDefiningLine, BezierStateDefiningCP1, BezierStateDefiningCP2 }; @interface BezierView : UIView { CGPoint startPt, endPt, cPt1, cPt2; UInt8 state; UIBezierPath *curvePath; @private UITouch *currentTouch; } @property (nonatomic, retain) UIBezierPath *curvePath; @end 

BezierView.m

 @interface BezierView @dynamic curvePath; - (UIBezierPath *)curvePath { return [[curvePath retain] autorelease]; } - (void)setCurvePath:(UIBezierPath *)newPath { id tmp = curvePath; curvePath = [newPath retain]; [tmp release]; state = BezierStateNone; [self setNeedsDisplay]; } - (void)_updateCurve { UIBezierPath *path = [UIBezierPath bezierPath]; [path moveToPoint:startPt]; [path addCurveToPoint:endPt controlPoint1:cPt1 controlPoint2:cPt2]; } - (void)_calcDefaultControls { if(ABS(startPt.x - endPt.x) > ABS(startPt.y - endPt.y)) { cPt1 = (CGPoint){(startPt.x + endPt.x) / 2, startPt.y}; cPt2 = (CGPoint){cPt1.x, endPt.y}; } else { cPt1 = (CGPoint){startPt.x, (startPt.y + endPt.y) / 2}; cPt2 = (CGPoint){endPt.x, cPt1.y}; } } - (void)drawRect:(CGRect)rect { UIBezierPath *path = self.curvePath; if(path) [path stroke]; } - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { if(currentTouch) return; if(state == BezierStateNone) { state = BezierStateDefiningLine; currentTouch = [touches anyObject]; startPt = [currentTouch locationInView:self]; } else if(state == BezierStateDefiningCP1) { currentTouch = [touches anyObject]; cPt1 = [currentTouch locationInView:self]; [self _updateCurve]; } else if(state == BezierStateDefiningCP2) { currentTouch = [touches anyObject]; cPt2 = [currentTouch locationInView:self]; [self _updateCurve]; } } - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { if(!currentTouch) return; if(state == BezierStateDefiningLine) { endPt = [currentTouch locationInView:self]; [self _calcDefaultControls]; [self _updateCurve]; } else if(state == BezierStateDefiningCP1) { cPt1 = [currentTouch locationInView:self]; [self _updateCurve]; } else if(state == BezierStateDefiningCP2) { cPt2 = [currentTouch locationInView:self]; [self _updateCurve]; } } - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { if(!currentTouch) return; if(state == BezierStateDefiningLine) { state = BezierStateDefiningCP1; } else if(state == BezierStateDefiningCP1) { state = BezierStateDefiningCP2; } else if(state == BezierStateDefiningCP2) { state = BezierStateNone; } currentTouch = nil; } - (void)touchesCanceled:(NSSet *)touches withEvent:(UIEvent *)event { if(state == BezierStateDefiningLine) { self.curvePath = nil; self.state = BezierStateNone; } self.currentTouch = nil; } 

好吧,最简单的方法可能是UIView并使用CoreGraphics进行绘制。 查看来自QuarzDemo的示例代码。 为您的自定义视图类实现drawInRect – 方法。 并用touchesBegantouchesMoved等来检测用户的触摸。

这是一个示例代码(取自QuarzDemo)绘制贝塞尔曲线:

 // Drawing with a white stroke color CGContextSetRGBStrokeColor(context, 1.0, 1.0, 1.0, 1.0); // Draw them with a 2.0 stroke width so they are a bit more visible. CGContextSetLineWidth(context, 2.0); // Draw a bezier curve with end points s,e and control points cp1,cp2 CGPoint s = CGPointMake(30.0, 120.0); CGPoint e = CGPointMake(300.0, 120.0); CGPoint cp1 = CGPointMake(120.0, 30.0); CGPoint cp2 = CGPointMake(210.0, 210.0); CGContextMoveToPoint(context, sx, sy); CGContextAddCurveToPoint(context, cp1.x, cp1.y, cp2.x, cp2.y, ex, ey); CGContextStrokePath(context); 

希望能帮助你入门;)