iOS水波扩散效果实现

实现效果

水波纹从中心从外侧扩散的效果实现:


wave.png

实现思路

1、通过一个定时器等,重复的创建一个圆;
2、将创建的圆,进行倍数放大,实现扩散效果;
3、将放大的圆的透明度从1~0做一个变化,实现往外淡出的效果;
4、放大后的圆视图从父视图上移除。
这样,创建、扩大、移除中实现水波纹扩散的效果。当然对于圆圈视图需要再其内部通过- (void)drawRect:(CGRect)rect方法画圆。

代码如下

写一个圆圈视图DDWaterVaveView

#import "DDWaterVaveView.h"

@interface DDWaterVaveView ()

@property (nonatomic) NSTimer     *timer;

@end

@implementation DDWaterVaveView

- (instancetype)initWithFrame:(CGRect)frame {
    if (self = [super initWithFrame:frame]) {
        
        self.backgroundColor = [UIColor clearColor];
    }
    return self;
}

- (void)drawRect:(CGRect)rect
{
    [super drawRect:rect];
    
    //最初半径
    CGFloat radius = self.frame.size.width * 0.5;
    //开始角
    CGFloat startAngle = 0;
    //结束角
    CGFloat endAngle = 2 * M_PI;
    //中心点
    NSLog(@"------ %f",self.frame.size.width);//这里放大多少就取放大值的2倍的分之一
    CGPoint center = CGPointMake(self.frame.size.width*0.25, self.frame.size.height*0.25);
    //画圆
    UIBezierPath *bezierPath = [UIBezierPath bezierPathWithArcCenter:center radius:radius startAngle:startAngle endAngle:endAngle clockwise:YES];
    //生成layer对象
    CAShapeLayer *shapeLayer = [[CAShapeLayer alloc] init];
    shapeLayer.path = bezierPath.CGPath;//设置path
    shapeLayer.strokeColor = [UIColor lightGrayColor].CGColor;//圆边框颜色
    shapeLayer.fillColor = [UIColor lightGrayColor].CGColor;//圆填充颜色
    //添加layer对象
    [self.layer addSublayer:shapeLayer];
}

调用实现效果

#import "ViewController.h"
#import "DDWaterVaveView.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    
    [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(clickAnimation:) userInfo:nil repeats:YES];
}

- (void)clickAnimation:(id)sender {
    __block DDWaterVaveView *waterView = [[DDWaterVaveView alloc]initWithFrame:CGRectMake(100, 100, 50, 50)];
    [self.view addSubview:waterView];
    
    [UIView animateWithDuration:2 animations:^{
        waterView.transform = CGAffineTransformScale(waterView.transform, 2, 2);
        waterView.alpha = 0;
        
    } completion:^(BOOL finished) {
        [waterView removeFromSuperview];
    }];
}

@end

说明

查了查资料自己整理的,只是做了代码的搬运工而已。我看了网上还有其他实现思路,也是可以借鉴的。此外本篇的实现封装的并不是很彻底。
大家有不同的思路或者想法可以互相交流。

https://github.com/Mexiang/WaterWave

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 176,036评论 25 709
  • 狗是人类的朋友,但是我们经常看到有些流浪狗不是缺腿就是缺尾巴,甚至招人追打。 狗是聪明的动物,能听懂人的语言,对人...
    视乎阅读 3,106评论 0 0
  • 2017.12.07星期四,天气很冷,傍晚的时候飘起了小雪花,女儿在托付已经写完作业了,我们俩去吃的牛杂面,感觉不...
    张倩与译丹阅读 1,391评论 0 0
  • 屋主通过空间的合理利用将一套98㎡打造成三居室的美式风格,整体造型很是温馨。 客厅 客厅没有采用阳台设计,而是榻榻...
    三曦坊阅读 3,130评论 0 2
  • 村里的大水库和大水塘是连在一起的,也差不多大,就一条通往对岸菜园子的堤岸隔断了两边的水。只是村民更看重大水库些,...
    公子渭渠阅读 3,030评论 4 2

友情链接更多精彩内容