iOS如何自定义UIButton点击动画特效
发表于:2025-01-20 作者:千家信息网编辑
千家信息网最后更新 2025年01月20日,这篇文章主要介绍了iOS如何自定义UIButton点击动画特效,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。代码:ViewContro
千家信息网最后更新 2025年01月20日iOS如何自定义UIButton点击动画特效
这篇文章主要介绍了iOS如何自定义UIButton点击动画特效,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。
代码:
ViewController:
#import@interface ViewController : UIViewController@end#import "ViewController.h"#import "HWButton.h"#define mainW [UIScreen mainScreen].bounds.size.width#define mainH [UIScreen mainScreen].bounds.size.height@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad { [super viewDidLoad]; self.view.backgroundColor = [UIColor blackColor]; //创建控件 [self creatButton];}- (void)creatButton{ HWButton *button = [[HWButton alloc] initWithFrame:CGRectMake(mainW * 0.5 - 60, mainH - 100, 120, 72) maxLeft:100 maxRight:100 maxHeight:300]; [button setImage:[UIImage imageNamed:@"button"] forState:UIControlStateNormal]; button.images = @[[UIImage imageNamed:@"Circle 1"], [UIImage imageNamed:@"Circle 2"], [UIImage imageNamed:@"Circle 3"], [UIImage imageNamed:@"Hero"]]; button.duration = 10; [button addTarget:self action:@selector(buttonOnClick:) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:button];}- (void)buttonOnClick:(HWButton *)btn{ [btn generateBubbleInRandom];}@end
HWButton:
#import@interface HWButton : UIButton@property (nonatomic, assign) CGFloat maxLeft;@property (nonatomic, assign) CGFloat maxRight;@property (nonatomic, assign) CGFloat maxHeight;@property (nonatomic, assign) CGFloat duration;@property (nonatomic, strong) NSArray *images;- (instancetype)initWithFrame:(CGRect)frame maxLeft:(CGFloat)maxLeft maxRight:(CGFloat)maxRight maxHeight:(CGFloat)maxHeight;- (void)generateBubbleWithImage:(UIImage *)image;- (void)generateBubbleInRandom;@end#import "HWButton.h"@implementation HWButton{ CGPoint _startPoint; CGFloat _maxWidth; NSMutableSet *_recyclePool; NSMutableArray *_array;}- (instancetype)initWithFrame:(CGRect)frame maxLeft:(CGFloat)maxLeft maxRight:(CGFloat)maxRight maxHeight:(CGFloat)maxHeight{ self = [super initWithFrame:frame]; if (self) { _maxHeight = maxHeight; _maxLeft = maxLeft; _maxRight = maxRight; [self initData]; } return self;}- (id)initWithCoder:(NSCoder *)aDecoder{ self = [super initWithCoder:aDecoder]; if (self) { [self initData]; } return self;}- (void)initData{ _array = @[].mutableCopy; _recyclePool = [NSMutableSet set];}- (void)generateBubbleInRandom{ CALayer *layer; if (_recyclePool.count > 0) { layer = [_recyclePool anyObject]; [_recyclePool removeObject:layer]; }else { UIImage *image = self.images[arc4random() % self.images.count]; layer = [self createLayerWithImage:image]; } [self.layer addSublayer:layer]; [self generateBubbleWithCAlayer:layer];}- (void)generateBubbleWithImage:(UIImage *)image{ CALayer *layer = [self createLayerWithImage:image]; [self.layer addSublayer:layer]; [self generateBubbleWithCAlayer:layer];}- (void)generateBubbleWithCAlayer:(CALayer *)layer{ _maxWidth = _maxLeft + _maxRight + self.bounds.size.width; _startPoint = CGPointMake(self.frame.size.width / 2, 0); CGPoint endPoint = CGPointMake(_maxWidth * [self randomFloat] - _maxLeft, -_maxHeight); CGPoint controlPoint1 = CGPointMake(_maxWidth * [self randomFloat] - _maxLeft, -_maxHeight * 0.2); CGPoint controlPoint2 = CGPointMake(_maxWidth * [self randomFloat] - _maxLeft, -_maxHeight * 0.6); CGMutablePathRef curvedPath = CGPathCreateMutable(); CGPathMoveToPoint(curvedPath, NULL, _startPoint.x, _startPoint.y); CGPathAddCurveToPoint(curvedPath, NULL, controlPoint1.x, controlPoint1.y, controlPoint2.x, controlPoint2.y, endPoint.x, endPoint.y); CAKeyframeAnimation *keyFrame = [CAKeyframeAnimation animation]; keyFrame.keyPath = @"position"; keyFrame.path = CFAutorelease(curvedPath); keyFrame.duration = self.duration; keyFrame.calculationMode = kCAAnimationPaced; [layer addAnimation:keyFrame forKey:@"keyframe"]; CABasicAnimation *scale = [CABasicAnimation animation]; scale.keyPath = @"transform.scale"; scale.toValue = @1; scale.fromValue = [NSValue valueWithCATransform3D:CATransform3DMakeScale(0.1, 0.1, 0.1)]; scale.duration = 0.5; CABasicAnimation *alpha = [CABasicAnimation animation]; alpha.keyPath = @"opacity"; alpha.fromValue = @1; alpha.toValue = @0.1; alpha.duration = self.duration * 0.4; alpha.beginTime = self.duration - alpha.duration; CAAnimationGroup *group = [CAAnimationGroup animation]; group.animations = @[keyFrame, scale, alpha]; group.duration = self.duration; group.delegate = self; group.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]; group.fillMode = kCAFillModeForwards; group.removedOnCompletion = NO; [layer addAnimation:group forKey:@"group"]; [_array addObject:layer];}- (CGFloat)randomFloat{ return (arc4random() % 100)/100.0f;}- (CALayer *)createLayerWithImage:(UIImage *)image{ CGFloat scale = [UIScreen mainScreen].scale; CALayer *layer = [CALayer layer]; layer.frame = CGRectMake(0, 0, image.size.width / scale, image.size.height / scale); layer.contents = (__bridge id)image.CGImage;; return layer;}- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag{ if (flag) { CALayer *layer = [_array firstObject]; [layer removeAllAnimations]; [layer removeFromSuperlayer]; [_array removeObject:layer]; [_recyclePool addObject:layer]; }}@end
感谢你能够认真阅读完这篇文章,希望小编分享的"iOS如何自定义UIButton点击动画特效"这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习!
篇文章
动画
特效
代码
价值
兴趣
同时
控件
更多
朋友
知识
编带
行业
资讯
资讯频道
频道
参考
学习
帮助
支持
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
游戏服务器如何维护
自建数据库完整方案
pgsql是什么类型数据库
企业管理数据库设计
我的世界出售服务器
科迅软件开发有限公司
创造与魔法服务器最少的人
我国制定网络安全法的目的是
服务器搭建游戏主机
csharp 数据库
全面解读网络安全法1
线下网络安全培训哪个好
浙江米尚网络技术 网红
湖北软件开发解决方案定制
四川省网络安全
信息系统与数据库技术好学吗
服务器主板上有哪些接口和卡槽
sql数据库引擎设置
江苏省中小企业人才数据库
网络安全分析师就业
人大金仓数据库停止命令
大连松下软件开发项目经理
小学生宣传网络安全手抄报
网络安全论坛方案
ipv6电脑服务器
软件开发书籍
成都手机app软件开发
服务器带内和带外管理
南通市软件开发有没有国企
河南浪潮服务器虚拟化解决方案