遇到過這種需求要做成類似與蘋果刪除軟件時的動態效果。
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(@"已經刪除,要做什么事");}
以上就是本文的全部內容,希望對大家的學習有所幫助。
新聞熱點
疑難解答