碰到過這類需求要做成相似與蘋果刪除軟件時的靜態後果。
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(@"曾經刪除,要做甚麼事"); }
以上就是本文的全體內容,願望對年夜家的進修有所贊助。
【iOS自界說button發抖後果並完成右上角刪除按鈕】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!