首页 > 手机专区 > 手机APP >

iOS如何实现水波纹动画加载效果

来源:互联网 2023-03-03 23:35:47 121

基于CADisplayLink定时器与正弦函数实现水波纹动画效果的绘制。2Rb办公区 - 实用经验教程分享!

工具/原料

  • Xcode

方法/步骤

  • 1

    为实现封装采用自定义View的形式,.m先定义相关用的控制属性以及定时器,如下:2Rb办公区 - 实用经验教程分享!

    @property (nonatomic, strong) CADisplayLink *displayLink;2Rb办公区 - 实用经验教程分享!

    @property (nonatomic, assign) CGFloat fAmplitude; /// 振幅2Rb办公区 - 实用经验教程分享!

    @property (nonatomic, assign) CGFloat fCycle; /// 周期2Rb办公区 - 实用经验教程分享!

    @property (nonatomic, assign) CGFloat fHdistance; /// 水平之间偏移2Rb办公区 - 实用经验教程分享!

    @property (nonatomic, assign) CGFloat fVdistance; /// 竖直之间偏移2Rb办公区 - 实用经验教程分享!

    @property (nonatomic, assign) CGFloat fSscale; /// 速度2Rb办公区 - 实用经验教程分享!

    @property (nonatomic, assign) CGFloat fOffsety; /// 波峰所在位置的y坐标2Rb办公区 - 实用经验教程分享!

    @property (nonatomic, assign) CGFloat fWidth; /// 移动的距离,配合速率设置2Rb办公区 - 实用经验教程分享!

    @property (nonatomic, assign) CGFloat fOffsetx; /// 偏移2Rb办公区 - 实用经验教程分享!

    @property (nonatomic, assign) CGFloat fUPScale; /// 上升的速度2Rb办公区 - 实用经验教程分享!

    iOS如何实现水波纹动画加载效果2Rb办公区 - 实用经验教程分享!

  • 1此文章非法爬取自百度经验
  • 2

    重写视图的- (instancetype)initWithFrame:(CGRect)frame方法进行初始化相关操作,同时实例化定时器,如下:2Rb办公区 - 实用经验教程分享!

    self.backgroundColor = [UIColor clearColor];2Rb办公区 - 实用经验教程分享!

    _progress = 0;2Rb办公区 - 实用经验教程分享!

    self.fAmplitude = self.frame.size.height / 25;2Rb办公区 - 实用经验教程分享!

    self.fCycle = 2 * M_PI / (self.frame.size.width * 0.9);2Rb办公区 - 实用经验教程分享!

    self.fHdistance = 2 * M_PI / self.fCycle * 0.6;2Rb办公区 - 实用经验教程分享!

    self.fVdistance = self.fAmplitude * 0.4;2Rb办公区 - 实用经验教程分享!

    self.fWidth = 0.5;2Rb办公区 - 实用经验教程分享!

    self.fSscale = 0.4;2Rb办公区 - 实用经验教程分享!

    self.fUPScale = 0.1;2Rb办公区 - 实用经验教程分享!

    self.fOffsety = (1 - _progress) * (self.frame.size.height 2 * self.fAmplitude);2Rb办公区 - 实用经验教程分享!

    2Rb办公区 - 实用经验教程分享!

    self.displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(displayLinkAction)];2Rb办公区 - 实用经验教程分享!

    [self.displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes];2Rb办公区 - 实用经验教程分享!

    iOS如何实现水波纹动画加载效果2Rb办公区 - 实用经验教程分享!

  • 3

    定时器的响应方法是同步界面刷新一直绘制水波纹,self.fOffsety属性用来控制显示,如下:2Rb办公区 - 实用经验教程分享!

    - (void)displayLinkAction2Rb办公区 - 实用经验教程分享!

    {2Rb办公区 - 实用经验教程分享!

    self.fOffsetx = self.fWidth * self.fSscale;2Rb办公区 - 实用经验教程分享!

    if (self.fOffsety = 0.01)2Rb办公区 - 实用经验教程分享!

    {2Rb办公区 - 实用经验教程分享!

    [self.displayLink invalidate];2Rb办公区 - 实用经验教程分享!

    self.displayLink = nil;2Rb办公区 - 实用经验教程分享!

    2Rb办公区 - 实用经验教程分享!

    }2Rb办公区 - 实用经验教程分享!

    [self setNeedsDisplay];2Rb办公区 - 实用经验教程分享!

    }2Rb办公区 - 实用经验教程分享!

    iOS如何实现水波纹动画加载效果2Rb办公区 - 实用经验教程分享!

  • 4

    界面刷新会调用2Rb办公区 - 实用经验教程分享!

    - (void)drawRect:(CGRect)rect2Rb办公区 - 实用经验教程分享!

    方法进行绘制,在此方法里面结合UIBezierPath实现水波纹的实现,如下:2Rb办公区 - 实用经验教程分享!

    2Rb办公区 - 实用经验教程分享!

    - (void)drawRect:(CGRect)rect2Rb办公区 - 实用经验教程分享!

    {2Rb办公区 - 实用经验教程分享!

    UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:rect];2Rb办公区 - 实用经验教程分享!

    [[UIColor groupTableViewBackgroundColor] setFill];2Rb办公区 - 实用经验教程分享!

    [path fill];2Rb办公区 - 实用经验教程分享!

    [path addClip];2Rb办公区 - 实用经验教程分享!

    2Rb办公区 - 实用经验教程分享!

    //绘制两个波形图2Rb办公区 - 实用经验教程分享!

    [self drawWaveColor:[UIColor colorWithRed:0/255.0 green:191/255.0 blue:255/255.0 alpha:1.0f] offsetx:0 offsety:0];2Rb办公区 - 实用经验教程分享!

    [self drawWaveColor:[UIColor colorWithRed:0/255.0 green:191/255.0 blue:255/255.0 alpha:0.4f] offsetx:self.fHdistance offsety:self.fVdistance];2Rb办公区 - 实用经验教程分享!

    }2Rb办公区 - 实用经验教程分享!

    iOS如何实现水波纹动画加载效果2Rb办公区 - 实用经验教程分享!

  • 5

    水波纹具体绘制如下,采用正弦函数进行曲线绘制。2Rb办公区 - 实用经验教程分享!

    2Rb办公区 - 实用经验教程分享!

    - (void)drawWaveColor:(UIColor *)color offsetx:(CGFloat)offsetx offsety:(CGFloat)offsety2Rb办公区 - 实用经验教程分享!

    {2Rb办公区 - 实用经验教程分享!

    CGFloat end_offY = (1 - _progress) * (self.frame.size.height 2 * self.fAmplitude);2Rb办公区 - 实用经验教程分享!

    if (self.fOffsety != end_offY) {2Rb办公区 - 实用经验教程分享!

    if (end_offY self.fOffsety) {2Rb办公区 - 实用经验教程分享!

    self.fOffsety = MAX(self.fOffsety -= (self.fOffsety - end_offY) * self.fUPScale, end_offY);2Rb办公区 - 实用经验教程分享!

    }else {2Rb办公区 - 实用经验教程分享!

    self.fOffsety = MIN(self.fOffsety = (end_offY - self.fOffsety) * self.fUPScale, end_offY);2Rb办公区 - 实用经验教程分享!

    }2Rb办公区 - 实用经验教程分享!

    }2Rb办公区 - 实用经验教程分享!

    2Rb办公区 - 实用经验教程分享!

    UIBezierPath *wavePath = [UIBezierPath bezierPath];2Rb办公区 - 实用经验教程分享!

    for (float next_x = 0.f; next_x = self.frame.size.width; next_x ) {2Rb办公区 - 实用经验教程分享!

    CGFloat next_y = self.fAmplitude * sin(self.fCycle * next_x self.fOffsetx offsetx / self.bounds.size.width * 2 * M_PI) self.fOffsety offsety;2Rb办公区 - 实用经验教程分享!

    if (next_x == 0) {2Rb办公区 - 实用经验教程分享!

    [wavePath moveToPoint:CGPointMake(next_x, next_y - self.fAmplitude)];2Rb办公区 - 实用经验教程分享!

    }else {2Rb办公区 - 实用经验教程分享!

    [wavePath addLineToPoint:CGPointMake(next_x, next_y - self.fAmplitude)];2Rb办公区 - 实用经验教程分享!

    }2Rb办公区 - 实用经验教程分享!

    }2Rb办公区 - 实用经验教程分享!

    [wavePath addLineToPoint:CGPointMake(self.frame.size.width, self.frame.size.height)];2Rb办公区 - 实用经验教程分享!

    [wavePath addLineToPoint:CGPointMake(0, self.bounds.size.height)];2Rb办公区 - 实用经验教程分享!

    [color set];2Rb办公区 - 实用经验教程分享!

    [wavePath fill];2Rb办公区 - 实用经验教程分享!

    }2Rb办公区 - 实用经验教程分享!

    iOS如何实现水波纹动画加载效果2Rb办公区 - 实用经验教程分享!

  • 6

    自定义View封装实现之后,在需要调用的地方实例化view加载到指定view上即可:2Rb办公区 - 实用经验教程分享!

    WaveView *waveView = [[WaveView alloc] initWithFrame:CGRectMake(30, 100, 150, 150)];2Rb办公区 - 实用经验教程分享!

    [self.view addSubview:waveView];2Rb办公区 - 实用经验教程分享!

    iOS如何实现水波纹动画加载效果2Rb办公区 - 实用经验教程分享!

  • 7

    最终实现效果如下:2Rb办公区 - 实用经验教程分享!

    iOS如何实现水波纹动画加载效果2Rb办公区 - 实用经验教程分享!

    iOS如何实现水波纹动画加载效果2Rb办公区 - 实用经验教程分享!

  • 以上方法由办公区教程网编辑摘抄自百度经验可供大家参考!2Rb办公区 - 实用经验教程分享!


    标签: ios苹果

    办公区 Copyright © 2016-2023 www.bgqu.net. Some Rights Reserved. 备案号:湘ICP备2020019561号统计代码