iOS自定义button抖动效果并实现右上角删除按钮
遇到过这种需求要做成类似与苹果删除软件时的动态效果。
1.长按抖动;
2.抖动时出现一个X;
3.点击x,删除button;
4.抖动时,点击按钮,停止抖动;
下面是我的设计思路:
1.继承UIButton;
2.给button在右上角添加一个按钮;
3.给button添加长按手势;
4.给button添加遮盖,抖动时可以拦截点击事件;
有更好的做法,还请斧正。
// .m文件 #import "DZDeleteButton.h" #import "UIView+Extension.h" // 这个只是为了方便取宽高的一个分类,代码就不贴了 @interface DZDeleteButton () // 是否抖动 @property (nonatomic, assign, getter=isShaking) BOOL shaking; // 右上角的按钮, @property (nonatomic, weak) UIImageView *iconBtn; // 遮盖,在抖动时出现 @property (nonatomic, weak) UIView *coverView; @end @implementation DZDeleteButton - (UIImageView *)iconBtn { if (!_iconBtn) { UIImageView *iconBtn = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"delete"]]; iconBtn.userInteractionEnabled = YES; iconBtn.hidden = YES; _iconBtn = iconBtn; UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(iconClick)]; [iconBtn addGestureRecognizer:tap]; [self addSubview:iconBtn]; } return _iconBtn; } - (UIView *)coverView { if (!_coverView) { UIView *view = [[UIView alloc] init]; view.backgroundColor = [UIColor clearColor]; view.hidden = YES; UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(coverClick)]; [view addGestureRecognizer:tap]; [self addSubview:view]; _coverView = view; } return _coverView; } - (instancetype)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { [self addLongPressGestureRecognizer]; } return self; } - (instancetype)init { self = [super init]; if (self) { [self addLongPressGestureRecognizer]; } return self; } - (instancetype)initWithCoder:(NSCoder *)coder { self = [super initWithCoder:coder]; if (self) { [self addLongPressGestureRecognizer]; } return self; } // 添加长按手势 - (void)addLongPressGestureRecognizer { UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longClick)]; [self addGestureRecognizer:longPress]; } - (void)delete { [self.iconBtn.superview removeFromSuperview]; } // 是否执行动画 - (void)setShaking:(BOOL)shaking { if (shaking) { [self shakingAnimation]; self.coverView.hidden = NO; self.iconBtn.hidden = NO; } else { [self.layer removeAllAnimations]; self.coverView.hidden = YES; self.iconBtn.hidden = YES; } } #pragma mark - 抖动动画 #define Angle2Radian(angle) ((angle) / 180.0 * M_PI) - (void)shakingAnimation { CAKeyframeAnimation *anim = [CAKeyframeAnimation animation]; anim.keyPath = @"transform.rotation"; anim.values = @[@(Angle2Radian(-5)), @(Angle2Radian(5)), @(Angle2Radian(-5))]; anim.duration = 0.25; // 动画次数设置为最大 anim.repeatCount = MAXFLOAT; // 保持动画执行完毕后的状态 anim.removedOnCompletion = NO; anim.fillMode = kCAFillModeForwards; [self.layer addAnimation:anim forKey:@"shake"]; } - (void)longClick { if (self.shaking) return; self.shaking = YES; } // 点击右上角按钮 - (void)iconClick { [self removeFromSuperview]; // 设计一个代理,为了在自己被删除后做一些事情(例如,对页面进行布局) if ([self.delegate respondsToSelector:@selector(deleteButtonRemoveSelf:)]) { [self.delegate deleteButtonRemoveSelf:self]; } } - (void)coverClick { self.shaking = NO; } - (void)layoutSubviews { [super layoutSubviews]; // 调整位置 self.imageView.x = 0; self.imageView.y = 0; self.imageView.width = self.width; self.imageView.height = self.width; self.titleLabel.x = 0; self.titleLabel.width = self.width; if (self.width >= self.height) { self.titleLabel.height = 20; self.titleLabel.y = self.height - self.titleLabel.height; } else { self.titleLabel.y = self.imageView.height; self.titleLabel.height = self.height - self.titleLabel.y; } self.titleLabel.textAlignment = NSTextAlignmentCenter; self.iconBtn.size = CGSizeMake(self.width * 0.3, self.width * 0.3); self.iconBtn.x = self.width - self.iconBtn.width; self.iconBtn.y = 0; self.coverView.frame = self.bounds; [self bringSubviewToFront:self.iconBtn]; } @end
// .h文件 只有一个代理 #import <UIKit/UIKit.h> @class DZDeleteButton; @protocol DZDeleteButtonDelegate <NSObject> @optional - (void)deleteButtonRemoveSelf:(DZDeleteButton *)button; @end @interface DZDeleteButton : UIButton @property (nonatomic, weak) id<DZDeleteButtonDelegate> delegate; @end
上面效果图在vc中的代码
- (void)viewDidLoad { [super viewDidLoad]; DZDeleteButton *button = [[DZDeleteButton alloc] init]; [button setImage:[UIImage imageNamed:@"bj"] forState:UIControlStateNormal]; [button setTitle:@"百思" forState:UIControlStateNormal]; button.delegate = self; button.frame = CGRectMake(20, 20, 60, 80); [button setTitleColor:[UIColor redColor] forState:UIControlStateNormal]; [button addTarget:self action:@selector(btnClick) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:button]; } - (void)btnClick { NSLog(@"点击button"); } - (void)deleteButtonRemoveSelf:(DZDeleteButton *)button { NSLog(@"已经删除,要做什么事"); }
以上就是本文的全部内容,希望对大家的学习有所帮助。
赞 (0)