iOS 水波效果
将水波效果放在子视图上,主控制器只负责加载
#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 水波效果的更多相关文章
- 【转】提示框第三方库之MBProgressHUD iOS toast效果 动态提示框效果
原文网址:http://www.zhimengzhe.com/IOSkaifa/37910.html MBProgressHUD是一个开源项目,实现了很多种样式的提示框,使用上简单.方便,并且可以对显 ...
- Android仿IOS回弹效果 ScrollView回弹 总结
Android仿IOS回弹效果 ScrollView回弹 总结 应项目中的需求 须要仿IOS 下拉回弹的效果 , 我在网上搜了非常多 大多数都是拿scrollview 改吧改吧 试了一些 发现总 ...
- Android 实现高仿iOS桌面效果之可拖动的GridView(上)
转载请标明出处:http://blog.csdn.net/sk719887916/article/details/40074663,作者:skay 最近项目中遇到一个LIstview的拖动效 ...
- iOS 波浪效果的实现
iOS 波浪效果的实现 p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #4f8187; background-c ...
- canvas三角函数模拟水波效果
.katex { display: block; text-align: center; white-space: nowrap; } .katex-display > .katex > ...
- Unity3D Shader水波效果
水波效果 Shader "Custom/WaterWave" { Properties { _MainTex ("Base (RGB)", 2D) = &quo ...
- 使用js实现水波效果
使用到的工具:jQuery Ripples Plugin 下载安装 git clone https://github.com/sirxemic/jquery.ripples.git 引入jquery, ...
- 【iOS系列】- iOS吸附效果的实现 之 UICollectionView的使用全解
[iOS系列]- iOS吸附效果的实现 之 UICollectionView的使用全解 UICollectionView可以做很多的布局,在iOS开发中较为重要,所以这里就以实例来讲解UICollec ...
- css3之水波效果
这些效果可谓多种多样,当然用canvas.svg也都能实现奈何对这些有不熟悉(尴尬),不过咱们用css来写貌似也没想象中的那么难吧. 一 悬浮球水波效果 效果图 css .container { w ...
随机推荐
- 【转】android 欢迎界面翻页成效,仿微信第一次登陆介绍翻页界面
android 欢迎界面翻页效果,仿微信第一次登陆介绍翻页界面 本实例做的相对比较简单主要是对翻页控件的使用,有时候想要做一些功能是主要是先了解下是否有现成的控件可以使用,做起来比较简单不用费太大的劲 ...
- BrnShop:自定义插件
BrnShop开源网上商城第四讲:自定义插件 重要通知:BrnShop企业版NOSQL设计(基于Redis)已经开源!源码内置于最新版的BrnShop中,感兴趣的园友可以去下载来看看.官网地址:www ...
- 学点c++
描述现在有很多长方形,每一个长方形都有一个编号,这个编号可以重复:还知道这个长方形的宽和长,编号.长.宽都是整数:现在要求按照一下方式排序(默认排序规则都是从小到大): 1.按照编号从小到大排序 2. ...
- C#函数式程序设计之泛型(下)
C#函数式程序设计之泛型(下) 每当使用泛型类型时,可以通过where字句对泛型添加约束: + 这个例子直观地声明了一个约束:类型T必须与ListItem<string>相匹配.泛型类 ...
- Silverlight类百度文库在线文档阅读器(转)
百度文库阅读器是基于Flash的,用Silverlight其实也可以做. 我实现的在线阅读器可以应用于内网文档发布,在线阅览审批等.没有过多的堆积功能,专注于核心功能.主要有以下特性: 1. 基于XP ...
- mac os apache 配置方法详细介绍
我使用的Mac OS X版本是10.8.2,Mac自带了Apache环境. 启动Apache 设置虚拟主机 启动Apache 打开“终端(terminal)”,输入 sudo apachectl -v ...
- 可编辑DIV (contenteditable="true") 在鼠标光标处插入图片或者文字
近期需开发一个DIV做的编辑器,插入表情图片可直接预览效果,仔细参考了下百度贴吧的过滤粘贴过来文件的THML代码,自己整理了下.写出来只是和大家分享下,我自己也不大懂,经过努力,幸好搞定. 蛋疼的事情 ...
- 基本Guava工具
使用Joiner类 将任意字符串通过分隔符进行连接到一起是大多程序员经常做的事情.他们经常使用array,list,iterable并且循环变量将每一个临时变量添加到StringBuilder当中 ...
- Linux 中 crontab 详解及示例
cron是一个linux下的定时执行工具,可以在无需人工干预的情况下运行作业.由于Cron 是Linux的内置服务,但它不自动起来,可以用以下的方法启动.关闭这个服务: /sbin/service c ...
- hibernate添加spring 事务管理注意问题记录
今天弄了一天的hibernate添加事务的问题 首先,建立的是一个java工程,把hibernate添加进工程里,很容易就可以写一个增删改查的方法.索性就多加点东西,把接口,抽象类也加到里面,自己看着 ...