遇到过这种需求要做成类似与苹果删除软件时的动态效果。
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(@"已经删除,要做什么事");}
以上就是本文的全部内容,希望对大家的学习有所帮助。
新闻热点
疑难解答