zoukankan      html  css  js  c++  java
  • UIBezierPath 类的使用

    使用UIBezierPath类可以创建基于矢量的路径,这个类在UIKit中。此类是Core Graphics框架关于path的一个封装。使用此类可以定义简单的形状,如椭圆或者矩形,或者有多个直线和曲线段组成的形状。
    UIBezierPath对象是CGPathRef数据类型的封装。path如果是基于矢量形状的,都用直线和曲线段去创建。我们使用直线段去创建矩形和多边形,使用曲线段去创建弧(arc),圆或者其他复杂的曲线形状。每一段都包括一个或者多个点,绘图命令定义如何去诠释这些点。每一个直线段或者曲线段的结束的地方是下一个的开始的地方。每一个连接的直线或者曲线段的集合成为subpath。一个UIBezierPath对象定义一个完整的路径包括一个或者多个subpaths。

     + (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;// 弧线,
     /*
             center: 圆弧中心
             radius: 圆弧半径
             startAngle: 起点的角度(相对角度坐标系 0)
             endAngle: 结束点的角度(相对角度坐标系 0)
             clockwise: 是否顺时针方向
             */
    
     + (instancetype)bezierPathWithCGPath:(CGPathRef)CGPath; //通过 CGPath创建
    
     - (void)moveToPoint:(CGPoint)point; // 设置线段的起点
     // add*系列--定义一个或多个subpaths
     - (void)addLineToPoint:(CGPoint)point;// 添加直线
     - (void)addArcWithCenter:(CGPoint)center radius:(CGFloat)radius startAngle:(CGFloat)startAngle endAngle:(CGFloat)endAngle clockwise:(BOOL)clockwise NS_AVAILABLE_IOS(4_0);// 添加弧线
     - (void)addQuadCurveToPoint:(CGPoint)endPoint controlPoint:(CGPoint)controlPoint;// 添加二次贝塞尔曲线
     - (void)addCurveToPoint:(CGPoint)endPoint controlPoint1:(CGPoint)controlPoint1 controlPoint2:(CGPoint)controlPoint2; // 添加三次贝塞尔曲线
    
     // 绘制
     - (void)fill;// 线条区域颜色填充
     - (void)stroke;// 线条颜色绘制
     - (void)closePath; // 结束一个图形的subpath,也会连接最后一个点与初始点之间的直线
    - (void)removeAllPoints; //移除所有的点,删除所有的subPath
    - (void)appendPath:(UIBezierPath *)bezierPath; // 将bezierPath添加到当前path

    创建和使用一个UIBezierPath大概分为四步骤:
    (1)创建一个Bezier path对象。
    (2)使用方法moveToPoint:去设置初始线段的起点。
    (3)添加line或者curve去定义一个或者多个subpaths。
    (4)改变UIBezierPath对象跟绘图相关的属性。

     CAShapeLayer 介绍

       - 简单介绍:
         CAShapeLayer继承自CALayer,因此,可使用CALayer的所有属性。但是,CAShapeLayer需要和贝塞尔曲线配合使用才有意义。
    
         #CAShapeLayer和drawRect的比较
         - 1.drawRect:属于CoreGraphics框架,占用CPU,性能消耗大
         - 2.CAShapeLayer:属于CoreAnimation框架,通过GPU来渲染图形,节省性能。动画渲染直接提交给手机GPU,不消耗内存

    CAShapeLayer与UIBezierPath的关系

    - 1.CAShapeLayer中shape代表形状的意思,所以需要形状才能生效
    - 2.贝塞尔曲线可以创建基于矢量的路径,而UIBezierPath类是对CGPathRef的封装
    - 3.贝塞尔曲线给CAShapeLayer提供路径,CAShapeLayer在提供的路径中进行渲染。路径会闭环,所以绘制出了Shape
    - 4.用于CAShapeLayer的贝塞尔曲线作为path,其path是一个首尾相接的闭环的曲线,即使该贝塞尔曲线不是一个闭环的曲线

    代码具体的使用请参考 demo :https://github.com/SummerHH/BezierPath.git

     效果图:

    参考:

    http://www.jianshu.com/p/b1c38a3a67a9 iOS - 关于贝塞尔曲线与CAShapeLayer的学习
     [UIBezierPath类 介绍](http://blog.csdn.net/crayondeng/article/details/11093689)
  • 相关阅读:
    Ajax_ajax模板引擎 ---tmplate.js处理数据和标签拼接
    Ajax_ajax请求中的跨域问题---浏览器不允许ajax跨域获取服务器数据,那我们就用jsonp来实现跨域
    Ajax_jquery库中Ajax方法的使用
    第一阶段冲刺 second day
    第11周周总结
    用户场景分析
    第一阶段冲刺 first day
    第10周周总结
    第9周周总结
    查找水王
  • 原文地址:https://www.cnblogs.com/ningmengcao-ios/p/6848742.html
Copyright © 2011-2022 走看看