放肆地用 UIBezierPath 和 CAShapeLayer 画各类图形

CAShapeLayer 是 CALayer 的子类,可是比 CALayer 更灵活,能够画出各类图形,固然,你也能够使用其余方式来画,随你。git

杂谈

在 CAShapeLayer 中,也能够像 CALayer 同样指定它的 frame 来画,就像这样:程序员

而后你就会获得如图这样的黑色矩形github

可是,CAShapeLayer 有一个神奇的属性 path 用这个属性配合上 UIBezierPath 这个类就能够达到超神的效果。web

UIBezierPath 顾名思义,这是用贝塞尔曲线的方式来构建一段弧线,你能够用任意条弧线来组成你想要的形状,好比,你想用它来和上面同样画一个矩形,那就能够这样子来作:编程

要注意的是,这里就不要用backgroundColor 这个属性了,而要使用 fillColor  strokeColor ,前者表明设置这个 Layer 的填充色,后者表明设置它的边框色微信

能够试一下把上面代码设置颜色的部分改为这个样子,那么运行程序的时候就会是这种样子架构

玩一下UIBezierPath

在说回 UIBezierPath ,在 UIBezierPath 的 init 方法中,就有不少方便你画各类图形的方法,好比你能够画一个带圆角的图形socket

还能够指定起始角和半径画圆动画

在这里涉及到角度的问题,起始角和结束角,这里的角度使使用弧度制来表示,这里我收藏了一张图片,以方便参考网站

怎么画曲线

贝塞尔曲线的画法是由起点、终点、控制点三个参数来画的,为了解释清楚这个点,我写了几行代码来解释它

我很随意的定义了三个点,为了清楚显示它们的位置,我放了三个矩形在上面以便观察,而后调用 path.moveToPoint(startPoint) 让它移动到起始点,而后调用path.addQuadCurveToPoint(endPoint, controlPoint: controlPoint) 这个方法告诉它结束点和控制点,这样它就能画出一条有弧度的线条了,若是把fillColor设置一个颜色,那么它就会变成一个很丑的形状了,示例图以下

控制点决定了它的曲率,曲线的顶点不等于控制点的位置,具体能够看一下贝塞尔曲线的定义,你还能够使用两个控制点来画,两个控制点能够使用方法 path.addCurveToPoint(endPoint, controlPoint1: controlPoint, controlPoint2: controlPoint2)来搞定

这样它会是这个样子

再来讲说 CAShapeLayer

CAShapeLayer 是个神奇的东西,给它一个path它就能变成你想要的形状,它还有不少能够玩的地方。综合使用能够组合成不一样的动画,好比下面这样:

demo1.gif
demo2.gif
demo3.gif

这三个动画就是使用了 strokeEnd strokeStart lineWidth 三个属性,第一个动画用了strokeEnd这个属性的值范围是0-1,动画显示了从0到1之间每个值对这条曲线的影响,strokeStart的方法则是相反的,若是把这两个值首先都设置成0.5而后慢慢改变成0和1的时候就会变成第二个动画,配合lineWidth则曲线会慢慢变粗,这里的不少属性都是支持动画的。

示例代码

应用一下

前一阵子在仿时光网这个APP,其中有一个Layer的形状很怪异,是这样的

很明显它能够用 CAShapeLayer + UIBezierPath 来作,思路大概是这样,先移动到左上方的位置,而后向下划线,而后往右划线,而后往上划线,还剩一个盖子,这个盖子就用一个控制点控制曲率,很是简单,代码以下

就能画出这样的形状来

再来一个复杂点的,微信下拉拍小视频的那只眼睛颇有趣,来模仿一下那个效果吧,它是这样的

首先你得画出这只眼睛,这是眼睛包括5个部分组成(这个是用OC写的)

而后,仍是经过 UIBezierPath 和 CAShapeLayer 这样的老套路来画,代码较多

而后更改一下某些属性的值,方便稍后的动画

最后根据 UIScrollView 的 contentOffset 来控制各类属性,办法较笨,但管用。

最后

总之使用 UIbezierPath 和 CAShapeLayer 能够画出你想要的任何形状,没有它作不到,只有你想不到,搞定了它们你就能够轻松定制你想要的任何控件了。

问啊-一键呼叫程序员答题神器,牛人一对一服务,开发者编程必备官方网站:www.wenaaa.com

QQ群290551701 汇集不少互联网精英,技术总监,架构师,项目经理!开源技术研究,欢迎业内人士,大牛及新手有志于从事IT行业人员进入!

相关文章
相关标签/搜索