iOS开发之波浪动画效果
今天给大家讲述波浪效果的实现
直接上代码
#import <UIKit/UIKit.h> @interface HCLWaveAnimationView : UIView /** 振幅A */ @property (nonatomic, assign) CGFloat alpha; /** 角速度ω */ @property (nonatomic, assign) CGFloat omega; /** 初相φ */ @property (nonatomic, assign) CGFloat phi; /** 偏距k */ @property (nonatomic, assign) CGFloat kappa; /** 移动速度 */ @property (nonatomic, assign) CGFloat speed; @end
#import "HCLWaveAnimationView.h" @interface HCLWaveAnimationView () @property (nonatomic, strong) CADisplayLink *displayLink; @end @implementation HCLWaveAnimationView #pragma mark - 生命周期 - (instancetype)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { self.backgroundColor = [UIColor cyanColor]; self.alpha = self.bounds.size.height * 0.1; self.omega = M_PI * 2 / self.bounds.size.width; self.phi = 0; self.kappa = self.bounds.size.height * 0.5; self.speed = 5; self.displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(handleDisplay)]; [self.displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes]; } return self; } #pragma mark - drawRect - (void)drawRect:(CGRect)rect { CGContextRef cxt = UIGraphicsGetCurrentContext(); //初始化运动路径 CGMutablePathRef path = CGPathCreateMutable(); //设置起始位置 CGPathMoveToPoint(path, nil, 0, self.bounds.size.height); //正弦曲线公式为:y=Asin(ωx+φ)+k; for (CGFloat x = 0.0f; x <= self.bounds.size.width; x++) { CGFloat y = self.alpha * sinf(self.omega * x + self.phi) + self.kappa; CGPathAddLineToPoint(path, nil, x, y); } CGPathAddLineToPoint(path, nil, self.bounds.size.width, self.bounds.size.height); CGPathCloseSubpath(path); //绘制曲线 CGContextSetFillColorWithColor(cxt, [UIColor orangeColor].CGColor); CGContextSetLineWidth(cxt, 0.5); CGContextAddPath(cxt, path); CGContextFillPath(cxt); CGPathRelease(path); } #pragma mark - 响应事件 - (void)handleDisplay { if (!self.isHidden) { self.phi -= self.speed * self.omega; [self setNeedsDisplay]; } }
调用代码
HCLWaveAnimationView *animationView = [[HCLWaveAnimationView alloc] initWithFrame:CGRectMake(20, 100, self.view.bounds.size.width-40, 500)]; animationView.alpha = 15; animationView.kappa = 200; animationView.speed = 6; [self.view addSubview:animationView];
展示效果
demo的源码地址 https://github.com/hecanlin/WaveAnimation
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!