专栏名称: Cocoa开发者社区
CocoaChina苹果开发中文社区官方微信,提供教程资源、app推广营销、招聘、外包及培训信息、各类沙龙交流活动以及更多开发者服务。
目录
相关文章推荐
51好读  ›  专栏  ›  Cocoa开发者社区

为视图添加丝滑的水波纹

Cocoa开发者社区  · 公众号  · ios  · 2016-08-18 08:07

正文

▲点击上方“CocoaChina”关注即可免费学习 iOS 开发


作者:WelkinXie

原文链接:http://www.jianshu.com/p/0990d1d8d9c4


先看一下最终效果图:




首先我们可以把如此丝滑的水波纹拆分一下下:


  • 一条规律的曲线

  • 曲线匀速向右移动

  • 曲线下方的位置用颜色填充


于是先来一条曲线吧


对于需要产生波动如此规律的曲线,我们首先想到的应该就是三角函数了。


例如我们熟悉的正弦曲线:



及其公式:


f(x) = Asin(ωx+φ)+k


而SDK也为我们提供了这个正弦函数:


extern double sin(double);


于是乎通过一个循环就能轻易地获取到这条曲线了:


CGFloat y = 0.f;

for (CGFloat x = 0.f; x

y = height * sin(self.angularSpeed * x + self.offsetX);

CGPathAddLineToPoint(path, NULL, x, y);

}


让它动起来


我们需要在屏幕每次刷新的时候进行一次曲线的绘制,让它不断地刷新。


self.waveDisplayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(currentWave)];


而根据上面的正弦函数公式,曲线要向右移,其φ值就需要变小。于是在 currentWave 方法每次调用的时候,offsetX均减去同一个固定值,以实现匀速的运动。


self.offsetX -= self.waveSpeed;


涂个颜色


连个线,形成封闭空间:


CGMutablePathRef path = CGPathCreateMutable();

CGPathMoveToPoint(path, NULL, 0, height / 2);

CGFloat y = 0.f;

for (CGFloat x = 0.f; x

y = height * sin(self.angularSpeed * x + self.offsetX);

CGPathAddLineToPoint(path, NULL, x, y);

}

CGPathAddLineToPoint(path, NULL, width, height);

CGPathAddLineToPoint(path, NULL, 0, height);

CGPathCloseSubpath(path);


再填个色:


self.waveShapeLayer.fillColor = self.waveColor.CGColor;


好了。


至于最后的渐变消失略简单就不说了。有兴趣的直接到文末下载完整代码吧~


这水波纹并不限定在拖动过后才能波动,而是随时想动就动、想停就停。


于是最近我想到了一些新玩法,例如用作刷新等待视图。




更多的玩法就自行发掘吧~


完整代码呈上,其使用方法在该页面中会有介绍


Github: WXWaveView


END




小编推荐:[掘金]是一个高质量的技术社区,从 Swift 到 React Native,性能优化到动效源码,让你不错过 iOS 开发的每一个技术干货。长按图片二维码识别或者各大应用市场搜索「掘金」,技术干货尽在掌握中。



微信号:CocoaChinabbs


▲长按二维码“识别”关注即可免费学习 iOS 开发

月薪十万、出任CEO、赢娶白富美、走上人生巅峰不是梦

--------------------------------------

商务合作QQ:2408167315

投稿邮箱:[email protected]