将水波效果放在子视图上,主控制器只负责加载

#import "WaveProgress.h"

@interface WaveProgress ()

@property (nonatomic,assign)CGFloat yHeight;/**< 当前进度对应的y值,由于y是向下递增,所以要注意 */

@property (nonatomic,assign)CGFloat offset;/**< 偏移量,决定了这个点在y轴上的位置,以此来实现动态效果*/

@property (nonatomic,strong)CADisplayLink * link;/**< 定时器*/

@property (nonatomic,strong)CAShapeLayer * waveLayer;/**< 水波的layer */

@property (nonatomic,assign)CGFloat speed;/**< 波动的速度*/

@property (nonatomic,strong)UIColor * waveColor;

@property (nonatomic,assign)CGFloat waveHeight;

@end

@implementation WaveProgress

- (instancetype)initWithFrame:(CGRect)frame

{

self = [super initWithFrame:frame];

if (self) {

self.layer.borderColor = [UIColor lightGrayColor].CGColor;

self.layer.borderWidth = 1.0f;

self.waveHeight = 5.0;

self.speed = 1.0;

self.waveColor = [UIColor greenColor];

self.waveLayer = [CAShapeLayer layer];

self.waveLayer.frame = self.bounds;

self.waveLayer.fillColor = [UIColor whiteColor].CGColor;

[self.layer addSublayer:self.waveLayer];

//由于y坐标轴的方向是由上向下,逐渐增加的,所以这里对于y坐标进行处理

self.yHeight = self.bounds.size.height * 0.2;

//先停止动画,然后在开始动画,保证不会有什么冲突和重复.

[self stopWaveAnimation];

[self startWaveAnimation];

}

return self;

}

#pragma mark -- 开始波动动画

- (void)startWaveAnimation

{

//相对于NSTimer CADisplayLink更准确,每一帧调用一次.

self.link = [CADisplayLink displayLinkWithTarget:self selector:@selector(waveAnimation)];

[self.link addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];

}

#pragma mark -- 停止波动动画

- (void)stopWaveAnimation

{

[self.link invalidate];

self.link = nil;

}

#pragma mark -- 波动动画实现

- (void)waveAnimation

{

CGFloat waveHeight = self.waveHeight;

//如果是0或者1,则不需要wave的高度,否则会看出来一个小的波动.

//    if (self.progress == 0.0f || self.progress == 1.0f) {

//        waveHeight = 0.f;

//    }

//累加偏移量,这样就可以通过speed来控制波动的速度了.对于正弦函数中的各个参数,你可以通过上面的注释进行了解.

self.offset += self.speed;

CGMutablePathRef pathRef = CGPathCreateMutable();

CGFloat startOffY = waveHeight * sinf(self.offset * M_PI * 2 / self.bounds.size.width);

CGFloat orignOffY = 0.0;

CGPathMoveToPoint(pathRef, NULL, 0, startOffY);

for (CGFloat i = 0.f; i <= self.bounds.size.width; i++) {

orignOffY = waveHeight * sinf(2 * M_PI / self.bounds.size.width * i + self.offset * M_PI * 2 / self.bounds.size.width) + self.yHeight;

CGPathAddLineToPoint(pathRef, NULL, i, orignOffY);

}

//连接四个角和以及波浪,共同组成水波.

CGPathAddLineToPoint(pathRef, NULL, self.bounds.size.width, orignOffY);

CGPathAddLineToPoint(pathRef, NULL, self.bounds.size.width, self.bounds.size.height);

CGPathAddLineToPoint(pathRef, NULL, 0, self.bounds.size.height);

CGPathAddLineToPoint(pathRef, NULL, 0, startOffY);

CGPathCloseSubpath(pathRef);

self.waveLayer.path = pathRef;

self.waveLayer.fillColor = self.waveColor.CGColor;

CGPathRelease(pathRef);

}

@end

在主控制器中就懒加载一次就可以

- (WaveProgress *)progressView

{

if (!_progressView) {

_progressView = [[WaveProgress alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 150)];

}

return _progressView;

}

效果图如下

iOS 水波效果的更多相关文章

  1. 【转】提示框第三方库之MBProgressHUD iOS toast效果 动态提示框效果

    原文网址:http://www.zhimengzhe.com/IOSkaifa/37910.html MBProgressHUD是一个开源项目,实现了很多种样式的提示框,使用上简单.方便,并且可以对显 ...

  2. Android仿IOS回弹效果 ScrollView回弹 总结

    Android仿IOS回弹效果  ScrollView回弹 总结 应项目中的需求  须要仿IOS 下拉回弹的效果 , 我在网上搜了非常多 大多数都是拿scrollview 改吧改吧 试了一些  发现总 ...

  3. Android 实现高仿iOS桌面效果之可拖动的GridView(上)

    转载请标明出处:http://blog.csdn.net/sk719887916/article/details/40074663,作者:skay      最近项目中遇到一个LIstview的拖动效 ...

  4. iOS 波浪效果的实现

    iOS 波浪效果的实现 p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #4f8187; background-c ...

  5. canvas三角函数模拟水波效果

    .katex { display: block; text-align: center; white-space: nowrap; } .katex-display > .katex > ...

  6. Unity3D Shader水波效果

    水波效果 Shader "Custom/WaterWave" { Properties { _MainTex ("Base (RGB)", 2D) = &quo ...

  7. 使用js实现水波效果

    使用到的工具:jQuery Ripples Plugin 下载安装 git clone https://github.com/sirxemic/jquery.ripples.git 引入jquery, ...

  8. 【iOS系列】- iOS吸附效果的实现 之 UICollectionView的使用全解

    [iOS系列]- iOS吸附效果的实现 之 UICollectionView的使用全解 UICollectionView可以做很多的布局,在iOS开发中较为重要,所以这里就以实例来讲解UICollec ...

  9. css3之水波效果

    这些效果可谓多种多样,当然用canvas.svg也都能实现奈何对这些有不熟悉(尴尬),不过咱们用css来写貌似也没想象中的那么难吧. 一  悬浮球水波效果 效果图 css .container { w ...

随机推荐

  1. 解决Shockwave flash在chrome该浏览器崩溃

    越来越多的人开始使用chrome浏览器,很多用户都遇到过flash崩溃.有时重启chrome为了解决,有时不可能使用chrome无论打开什么网站是什么flash.这个问题是非常小的Firefox或IE ...

  2. 编辑控件CKEditor和CKFinder

    -使用HTML编辑控件CKEditor和CKFinder Web开发上有很多HTML的编辑控件,如CKEditor.kindeditor等等,很多都做的很好,本文主要介绍在MVC界面里面,CKEdit ...

  3. Javascript多线程引擎(一)

    Javascript多线程引擎(一) Javascript 天生是单线程的语言, 不支持synchronized等线程操作, 但是这便不妨碍Javascript作为web语言中最具有魅力语言之一. 虽 ...

  4. 如何使用MacVim

    如何使用MacVim 如何使用MacVim 如何使用MacVim呢? 命令模式 按下ESC 高效率移动 1.在插入模式之外 基本上来说,你应该尽可能少的呆在插入模式里面,因为在插入模式里面 VIM 就 ...

  5. 关于lower_bound的使用

    突然发现lower_bound是一个挺好用的东西, 在学习最长不下降子序列的nlogn的算法的时候看到的,C++党写起二分来一行- -P党一排233 感觉如果到时候需要用上二分的话,能用lower_b ...

  6. python读写protobuf

    0.     前期准备 官方protobuf定义 https://code.google.com/p/protobuf/   python使用指南 https://developers.google. ...

  7. 企业架构与建模之ArchiMate的由来和详述(上)

    终于完成了关于企业架构框架理论的总结,谢谢各位看官的支持,能挺过之前过于理论化的叙述而坚持到现在着实不易,笔者也自愧没有实践经验可以分享,希望日后有兴趣的看官能够不吝赐教.在本系列后面的也是最后一个大 ...

  8. IE回车的怪异行为

    问题 IE浏览器在input中回车,会触发button按钮的click事件. 原因分析 IE浏览器中在input中回车相当于提交form,而button标签默认的类型是submit, 所以如果没有指定 ...

  9. ShardedJedis实现学习

    ShardedJedis实现学习-我们到底能走多远系列(33) 我们到底能走多远系列(31) 扯淡: 工作是容易的赚钱是困难的 恋爱是容易的成家是困难的 相爱是容易的相处是困难的 决定是容易的可是等待 ...

  10. 2013年全球IT公司市值排行榜

    开源的应用快速开发平台 排名 公司 市值 国家 荣誉 1 苹果 5006.1 美国 全球市值最大的公司 2 谷歌 2324.4 美国 全球最伟大的互联网公司 3 三星 2290.7 韩国 全球最大的智 ...