UIBezierPath是UIKit中的一个关于图形绘制的类,是通过Quartz 2D也就是CG(Core Graphics)CGPathRef的封装得到的。

UIBezierPath

初始化方法

  1. UIBezierPath()

    这个使用比较多,因为这个工厂方法创建的对象,我们可以根据我们的需要任意定制样式,可以画任何我们想画的图形。
  2. public convenience init(rect: CGRect)
    创建并返回一个UIBezierPath对象,路径是一个矩形

  3. public convenience init(roundedRect rect: CGRect, cornerRadius: CGFloat)

创建一个UIBezierPath对象,路径是带圆角的矩形(四个角都是圆角)

  1. public convenience init(roundedRect rect: CGRect, byRoundingCorners corners: UIRectCorner, cornerRadii: CGSize)

创建一个UIBezierPath对象,路径是带圆角的矩形(可以选择那一个角是圆角)

    override func drawRect(rect: CGRect) {
        
        let p = UIBezierPath(roundedRect: CGRectMake(0, 0, 100, 100), byRoundingCorners: [.BottomLeft,.TopRight], cornerRadii: CGSize(width: 10, height: 10))
        UIColor.blueColor().setStroke()
        p.stroke()
    }
  1. public convenience init(ovalInRect rect: CGRect)

创建一个UIBezierPath对像,路径是椭圆(也可以创建圆,如果给的矩形是一个正方形)

  1. public convenience init(arcCenter center: CGPoint, radius: CGFloat, startAngle: CGFloat, endAngle: CGFloat, clockwise: Bool)

创建一个UIBezierPath对象,路径是弧度。

center: 圆形;radius:半径;startAngle:开始的弧度,endAngle:结束的弧度;clockwise:是否顺时针;

路径的构建

    // Path construction
    // 设置画笔起始点
    public func moveToPoint(point: CGPoint)
    // 从当前点到指定点绘制直线
    public func addLineToPoint(point: CGPoint)
    // 添加弧线
    public func addArcWithCenter(center: CGPoint, radius: CGFloat, startAngle: CGFloat, endAngle: CGFloat, clockwise: Bool)
    public func closePath()
    // 移除所有的点,删除所有的subPath
    public func removeAllPoints()

画一个三角形

        let p = UIBezierPath()
       p.moveToPoint(CGPoint(x: 10, y: 10))
       p.addLineToPoint(CGPoint(x: 30, y: 10))
       p.addLineToPoint(CGPoint(x: 20,y: 30))
       p.addLineToPoint(CGPoint(x: 10,y: 10))
       // 最后的闭合线是可以通过调用closePath方法来自动生成的
       UIColor.blueColor().setStroke()
       p.stroke()

画二次贝塞尔曲线

public func addQuadCurveToPoint(endPoint: CGPoint, controlPoint: CGPoint)

endPoint: 终端点

controlPoint: 控制点,对于二次贝尔曲线只有一个控制点

        let p = UIBezierPath()
       p.moveToPoint(CGPoint(x: 10, y: 10))
       p.addQuadCurveToPoint(CGPoint(x: 50,y: 10), controlPoint: CGPoint(x: 30, y: 50))
       UIColor.blueColor().setStroke()
       p.stroke()
       
       //这个样式看起来很像sin或者cos函数

画三次贝塞尔曲线

public func addCurveToPoint(endPoint: CGPoint, controlPoint1: CGPoint, controlPoint2: CGPoint)

endPoint: 终端点

controlPoint1: 控制点

controlPoint2:控制点

Accessing Drawing Properties

// Drawing properties
        //线的宽度
    public var lineWidth: CGFloat
    //设置线条拐角帽的样式
    public var lineCapStyle: CGLineCap
    /*
    public enum CGLineCap : Int32 {
    
    case Butt //默认
    case Round //轻微圆角
    case Square //方形
}
    */
    //设置两条线连结点的样式
    public var lineJoinStyle: CGLineJoin
    /*
    public enum CGLineJoin : Int32 {
    
    case Miter //默认
    case Round // 圆滑衔接
    case Bevel // 斜角衔接
}
    */
    
    //两条线交汇处内角和外角之间的最大距离,需要交叉点类型为kCGLineJoinMiter是生效,最大限制为10
    public var miterLimit: CGFloat // Used when lineJoinStyle is kCGLineJoinMiter
    // 个人理解为绘线的精细程度,默认为0.6,数值越大,需要处理的时间越长
    public var flatness: CGFloat
    //决定使用even-odd或者non-zero规则
    public var usesEvenOddFillRule: Bool // Default is NO. When YES, the even-odd fill rule is used for drawing, clipping, and hit testing.
    
    public func setLineDash(pattern: UnsafePointer<CGFloat>, count: Int, phase: CGFloat)
    public func getLineDash(pattern: UnsafeMutablePointer<CGFloat>, count: UnsafeMutablePointer<Int>, phase: UnsafeMutablePointer<CGFloat>)

Drawing Paths

    // Path operations on the current graphics context
    
    public func fill()
    public func stroke()
    
    // These methods do not affect the blend mode or alpha of the current graphics context
    public func fillWithBlendMode(blendMode: CGBlendMode, alpha: CGFloat)
    public func strokeWithBlendMode(blendMode: CGBlendMode, alpha: CGFloat)

Clipping Paths

// 在这以后的图形绘制超出当前路径范围则不可见
public func addClip()

Hit Detection

    // Path info
    // 是否为空
    public var empty: Bool { get }
    //整个路径相对于原点的位置以及宽度
    public var bounds: CGRect { get }
    //当前画笔的位置
    public var currentPoint: CGPoint { get }
    
    public func containsPoint(point: CGPoint) -> Bool

Applying Transformations

public func applyTransform(transform: CGAffineTransform)
// 反方向绘制path
 public func bezierPathByReversingPath() -> UIBezierPath

dowhilenet
654 声望10 粉丝

引用和评论

0 条评论