三、iOS中的贝塞尔曲线的应用
虽然贝塞尔曲线在很多开发领域都十分容易实现,由于我对iOS开发比较熟,并且上面的曲线绘制示例也是我通过iOS程序实现的。这里就对在iOS中应用贝塞尔曲线进行简单的讨论,首先CoreGraphics核心图形框架中提供了CGPath可以直接创建贝塞尔曲线,系统支持的贝塞尔曲线函数有二阶与三阶。前面有博客专门讨论,这里就不再赘述,地址如下:
https://my.oschina.net/u/2340880/blog/757072。
这里主要列举UIKit框架中的UIBezierPath类。
//构造方法 + (instancetype)bezierPath; //使用矩形进行构造 + (instancetype)bezierPathWithRect:(CGRect)rect; //使用圆角矩形进行构造 + (instancetype)bezierPathWithOvalInRect:(CGRect)rect; //创建圆角矩形贝塞尔路径 并设置圆角半径 + (instancetype)bezierPathWithRoundedRect:(CGRect)rect cornerRadius:(CGFloat)cornerRadius; + (instancetype)bezierPathWithRoundedRect:(CGRect)rect byRoundingCorners:(UIRectCorner)corners cornerRadii:(CGSize)cornerRadii; //使用圆弧创建 + (instancetype)bezierPathWithArcCenter:(CGPoint)center radius:(CGFloat)radius startAngle:(CGFloat)startAngle endAngle:(CGFloat)endAngle clockwise:(BOOL)clockwise; //使用CGPath创建 + (instancetype)bezierPathWithCGPath:(CGPathRef)CGPath; //CGPath对象 @property(nonatomic) CGPathRef CGPath; //将路径移动到某个点 - (void)moveToPoint:(CGPoint)point; //添加一天线 - (void)addLineToPoint:(CGPoint)point; //添加一个二阶贝塞尔曲线段 - (void)addCurveToPoint:(CGPoint)endPoint controlPoint1:(CGPoint)controlPoint1 controlPoint2:(CGPoint)controlPoint2; //添加一个三阶贝塞尔曲线段 - (void)addQuadCurveToPoint:(CGPoint)endPoint controlPoint:(CGPoint)controlPoint; //添加圆弧 - (void)addArcWithCenter:(CGPoint)center radius:(CGFloat)radius startAngle:(CGFloat)startAngle endAngle:(CGFloat)endAngle clockwise:(BOOL)clockwise; //关闭路径 - (void)closePath; //移除所有点 - (void)removeAllPoints; //添加一段路径 - (void)appendPath:(UIBezierPath *)bezierPath; //对路径进行逆向 - (UIBezierPath *)bezierPathByReversingPath; //进行transform变换 - (void)applyTransform:(CGAffineTransform)transform; //路径是否为空 @property(readonly,getter=isEmpty) BOOL empty; //尺寸 @property(nonatomic,readonly) CGRect bounds; //当前点 @property(nonatomic,readonly) CGPoint currentPoint; //判断是否包含某个点 - (BOOL)containsPoint:(CGPoint)point; //设置线宽 @property(nonatomic) CGFloat lineWidth; //设置线帽风格 @property(nonatomic) CGLineCap lineCapStyle; //设置折点风格 @property(nonatomic) CGLineJoin lineJoinStyle; @property(nonatomic) CGFloat miterLimit; @property(nonatomic) CGFloat flatness; //奇偶规则 @property(nonatomic) BOOL usesEvenOddFillRule; //进行虚线设置 - (void)setLineDash:(nullable const CGFloat *)pattern count:(NSInteger)count phase:(CGFloat)phase; - (void)getLineDash:(nullable CGFloat *)pattern count:(nullable NSInteger *)count phase:(nullable CGFloat *)phase; //进行填充绘制 - (void)fill; //进行路径绘制 - (void)stroke;
四、示例程序
下面是一个iOS平台的演示小Demo,使用它可以动态进行贝塞尔曲线的绘制并观察到辅助线与绘制过程,可以灵活的配置绘制的速度和控制点:
Github地址如下: