Swift之UIBezierPath

作者: Mi欧阳 | 来源:发表于2016-04-14 17:26 被阅读4404次

使用UIBezierPath可以创建基于矢量的路径。使用此类可以定义简单的形状,如椭圆、矩形或者有多个直线和曲线段组成的形状等。
主要用到的该类的属性包括

moveToPoint:  //设置起始点
addLineToPoint:  //从上一点连接一条线到本次指定的点
closePath()  //闭合路径,把起始点和终点连接起来
appendPath:  //多条路径合并
removeAllPoints()  //删除所有点和线

lineWidth  //路径宽度
lineCapStyle  //端点样式(枚举)
lineJoinStyle //连接点样式(枚举)

//下面这几个属性要用在UIView中重写drawRect:方法中使用才有效,否则不会出现效果
UIColor.redColor().setStroke() //设置路径颜色(不常用)
stroke()渲染路径
UIColor.redColor().setFill() //设置填充颜色(不常用)
fill()渲染填充部分

注:再次声明mainPath.stroke() 不是去连线的,而是在渲染路径

画直线

let mainPath = UIBezierPath()
mainPath.moveToPoint(CGPointMake(40, 0)) //开始绘制,表示这个点是起点
mainPath.addLineToPoint(CGPointMake(40, 100))
mainPath.removeAllPoints() //删除所有点和线

画圆弧(兼职画圆)

/*
  参数解释:
  1.center: CGPoint  中心点坐标
  2.radius: CGFloat  半径
  3.startAngle: CGFloat 起始点所在弧度
  4.endAngle: CGFloat   结束点所在弧度
  5.clockwise: Bool     是否顺时针绘制
  7.画圆时,没有坐标这个概念,根据弧度来定位起始点和结束点位置。M_PI即是圆周率。画半圆即(0,M_PI),代表0到180度。全圆则是(0,M_PI*2),代表0到360度
*/
let mainPath1 = UIBezierPath(arcCenter: CGPoint(x: 50, y: 50), radius: 50, startAngle: CGFloat(M_PI) * 0, endAngle: CGFloat(M_PI) * 2, clockwise: true)

除了直接初始化一个圆弧,也可以增加一段圆弧路径(mainPath1.addCurveToPoint:)

初始化时画圆

let mainPath2 = UIBezierPath(ovalInRect: CGRect(origin: CGPoint(x: 50, y: 50), size: CGSize(width: 30, height: 30)))

画赛贝尔曲线
贝塞尔线是用于主要用于绘制路径及帧动画,我们简单的看下用法,不做深究
详细资料:http://www.cnblogs.com/jay-dong/archive/2012/09/26/2704188.html

//二阶贝塞尔曲线
let mainPath3 = UIBezierPath()
mainPath3.moveToPoint(CGPointMake(0, 0))
mainPath3.addQuadCurveToPoint(CGPoint(x: 40, y: 0), controlPoint: CGPoint(x: 20, y:50))

//三阶贝塞尔曲线
let mainPath4 = UIBezierPath()
mainPath4.moveToPoint(CGPointMake(0, 0))
mainPath4.addCurveToPoint(CGPoint(x: 120, y: 0), controlPoint1: CGPoint(x: 40, y: 80), controlPoint2: CGPoint(x: 80, y: -80))

三角形

let mainPath5 = UIBezierPath()
mainPath5.moveToPoint(CGPointMake(40, 0))
mainPath5.addLineToPoint(CGPointMake(0, 40))
mainPath5.addLineToPoint(CGPointMake(80, 40))
mainPath5.closePath() //闭合路径,连线结束后会把起点和终点连起来

矩形

//实例化时建立矩形
let mainPath6 = UIBezierPath(rect: CGRect(x: 0, y: 0, width: 40, height: 60))

//实例化带圆角矩形
let mainPath7 = UIBezierPath(roundedRect: CGRect(x: 0, y: 0, width: 40, height: 40), cornerRadius: 10)

//实例化单角圆弧矩形
let mainPath8 = UIBezierPath(roundedRect: CGRect(x: 0, y: 0, width: 40, height: 40), byRoundingCorners: UIRectCorner.TopLeft, cornerRadii: CGSize(width: 10, height: 10))

//用路径方法画正方形
let mainPath9 = UIBezierPath()
mainPath9.moveToPoint(CGPointMake(0, 0))
mainPath9.addLineToPoint(CGPointMake(80, 0))
mainPath9.addLineToPoint(CGPointMake(80, 80))
mainPath9.addLineToPoint(CGPointMake(0, 80))
mainPath9.closePath() //和三角形一样需要闭合起点和终点
UIColor.redColor().setFill() //设置填充色
mainPath9.fill()

//多条路径合并

let mainPath10 = UIBezierPath()
mainPath10.moveToPoint(CGPointMake(0, 0))
mainPath10.addLineToPoint(CGPointMake(0, 80))

let mainPath11 = UIBezierPath()
mainPath11.moveToPoint(CGPointMake(0, 80))
mainPath11.addLineToPoint(CGPointMake(40, 40))

mainPath10.appendPath(mainPath11)//多条路径合并

//CAShapeLayer,可以看做一个动画容器。把UIBezierPath绘制的路径放进去,点就会沿着这路径前进,加上颜色、动画等渲染后显示在界面上

let shapeLayer = CAShapeLayer()
shapeLayer.path = mainPath11.CGPath //存入UIBezierPath的路径
shapeLayer.fillColor = UIColor.clearColor().CGColor //设置填充色
shapeLayer.lineWidth = 2  //设置路径线的宽度
shapeLayer.strokeColor = UIColor.grayColor().CGColor //路径颜色
//如果想变为虚线设置这个属性,[实线宽度,虚线宽度],若两宽度相等可以简写为[宽度]
shapeLayer.lineDashPattern = [2]
//一般可以填"path"  "strokeStart" "strokeEnd"  具体还需研究
let baseAnimation = CABasicAnimation(keyPath: "strokeEnd")
baseAnimation.duration = 2   //持续时间
baseAnimation.fromValue = 0  //开始值
baseAnimation.toValue = 2    //结束值
baseAnimation.repeatDuration = 5  //重复次数
shapeLayer.addAnimation(baseAnimation, forKey: nil) //给ShapeLayer添
//显示在界面上
self.view.layer.addSublayer(shapeLayer)

相关文章

网友评论

  • 肖皖:这是千峰被黑的最惨的一次 哈哈哈,连人话都不会,你教个jb
  • NetWork小贱:好不好,看其他人给你的评价,垃圾就是垃圾
  • Weartist:说的没什么用..
  • 4f6a2617054e:UIColor.red.setFill()
    path.fill()
    path.lineWidth = 2
    1、这么设置,颜色出不来啊
    2、动画可以暂停继续吗
  • NetWork小贱:垃圾
    肖皖:@NetWork小贱 你也配做开发?找不到工作的渣渣吧
    NetWork小贱:@肖皖 傻逼,草拟吗
    肖皖:你对得起你的昵称
  • AidenRao:回错人了 sorry
  • Bleiler:博主 知道怎么把画上的路径删除指定部分吗
    Mi欧阳:@音吹 shapeLayer.removeFromSuperlayer() 这个方法
    音吹:@Mi欧阳 请问UIBezierPath怎么整体删除..
    Mi欧阳:@GOOZ 没找到删除指定路径的方法,暂时只知道是整体删除的。为什么会有这类需求,可以详细说明下么?

本文标题:Swift之UIBezierPath

本文链接:https://www.haomeiwen.com/subject/hhiglttx.html