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

 更新时间:2016年03月22日 11:12:17   作者:明月钓无痕  
这篇文章主要为大家详细介绍了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(@"已经删除,要做什么事");
}

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

相关文章

  • IOSdrawRect实现雪花飘落效果

    IOSdrawRect实现雪花飘落效果

    这篇文章主要为大家详细介绍了IOSdrawRect实现雪花飘落效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-06-06
  • IOS中实现图片点击全屏预览

    IOS中实现图片点击全屏预览

    IOS作为一款智能手机系统,在查看图片的时候,如果能够实现全屏,对用户来说有很好的视觉体验,其实实现起来非常的简单,下面我就结合一个简单的代码给大家来分享一下,,需要的朋友可以参考下
    2015-11-11
  • iOS开发实现音频播放功能

    iOS开发实现音频播放功能

    本文给大家分享的是在IOS开发过程中实现音频播放的功能,讲解的十分细致,有需要的小伙伴可以参考下
    2016-03-03
  • iOS开发验证判断语句之正则表达式小结

    iOS开发验证判断语句之正则表达式小结

    最近在公司接手重构一个项目,发现之前的开发在验证格式这块写的太乱了,到处都有相关的验证代码,所以就有了这篇文章,供自己收藏也分享给有需要的朋友们参考借鉴,下面跟着小编来一起学习学习吧。
    2016-12-12
  • iOS实现UITableView数据为空时的提示页面

    iOS实现UITableView数据为空时的提示页面

    最近工作中遇到一个需求,当UITableView数据为空的时候,给出一个简单的提示页面,通过从网上查找解决的方法,发现了两种实现的方法,现在分享给大家,有需要的朋友们可以参考借鉴,下面感兴趣的朋友们来一起学习学习吧。
    2016-11-11
  • iOS获取设备唯一标识的实现步骤

    iOS获取设备唯一标识的实现步骤

    这篇文章主要介绍了iOS获取设备唯一标识的实现步骤,帮助大家更好的理解和学习ios开发,感兴趣的朋友可以了解下
    2021-04-04
  • IOS 开发之swift中UIView的扩展使用的实例

    IOS 开发之swift中UIView的扩展使用的实例

    这篇文章主要介绍了IOS 开发之swift中UIView的扩展使用的实例的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下
    2017-09-09
  • iOS中 UIActionSheet字体的修改

    iOS中 UIActionSheet字体的修改

    这篇文章主要介绍了iOS中 UIActionSheet字体的修改,需要的朋友可以参考下
    2017-06-06
  • iOS实现UIScrollView的无限轮播功能(原理)详解

    iOS实现UIScrollView的无限轮播功能(原理)详解

    在现在的一些App中常常见到图片轮播器,一般用于展示广告、新闻等数据,下面这篇文章主要给大家介绍了关于iOS实现UIScrollView的无限轮播功能(原理)的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2018-09-09
  • IOS开发UIPasteboard类的粘贴板全面详解

    IOS开发UIPasteboard类的粘贴板全面详解

    这篇文章主要为大家介绍了IOS开发UIPasteboard类的粘贴板全面详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06

最新评论