首页 > 系统 > iOS > 正文

iOS自定义button抖动效果并实现右上角删除按钮

2020-07-26 03:25:16
字体:
来源:转载
供稿:网友

遇到过这种需求要做成类似与苹果删除软件时的动态效果。

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(@"已经删除,要做什么事");}

以上就是本文的全部内容,希望对大家的学习有所帮助。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表