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

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

(0)

相关推荐

  • iOS设置UIButton文字显示位置和字体大小、颜色的方法

    前言 大家都知道UIButton按钮是IOS开发中最常用的控件,作为IOS基础学习教程知识 ,初学者需要了解其基本定义和常用设置,以便在开发在熟练运用. 一.iOS设置UIButton的字体大小 btn.frame = CGRectMake(x, y, width, height); [btn setTitle: @"search" forState: UIControlStateNormal]; //设置按钮上的自体的大小 //[btn setFont: [UIFont system

  • 详解iOS应用中自定义UIBarButtonItem导航按钮的创建方法

    iOS系统导航栏中有leftBarButtonItem和rightBarButtonItem,我们可以根据自己的需求来自定义这两个UIBarButtonItem. 四种创建方法 系统提供了四种创建的方法: 复制代码 代码如下: - (instancetype)initWithBarButtonSystemItem:(UIBarButtonSystemItem)systemItem target:(id)target action:(SEL)action; - (instancetype)init

  • 详解iOS中UIButton的三大UIEdgeInsets属性用法

    UIEdgeInsets是什么 UIEdgeInsets是什么?我们点进去看一下: typedef struct UIEdgeInsets { CGFloat top, left, bottom, right; // specify amount to inset (positive) for each of the edges. values can be negative to 'outset' } UIEdgeInsets; UIEdgeInsets是个结构体类型.里面有四个参数,分别是:

  • 详解iOS中Button按钮的状态和点击事件

    一.按钮的状态 1.UIControlStateNormal 1> 除开UIControlStateHighlighted.UIControlStateDisabled.UIControlStateSelected以外的其他情况,都是normal状态 2> 这种状态下的按钮[可以]接收点击事件 2.UIControlStateHighlighted 1> [当按住按钮不松开]或者[highlighted = YES]时就能达到这种状态 2> 这种状态下的按钮[可以]接收点击事件 3

  • iOS的UI开发中Button的基本编写方法讲解

    一.简单说明 一般情况下,点击某个控件后,会做出相应反应的都是按钮 按钮的功能比较多,既能显示文字,又能显示图片,还能随时调整内部图片和文字的位置 二.按钮的三种状态 normal(普通状态) 默认情况(Default) 对应的枚举常量:UIControlStateNormal highlighted(高亮状态) 按钮被按下去的时候(手指还未松开) 对应的枚举常量:UIControlStateHighlighted disabled(失效状态,不可用状态) 如果enabled属性为NO,就是处于

  • IOS开发UIButton(左边图片右边文字效果)

    在使用UIButton的时候,需要实现UIButton左边图片,图片后面紧跟文字效果比较麻烦,简单实现方法具体代码如下: (void)viewDidLoad { [super viewDidLoad]; self.view.backgroundColor = RGB(235, 235, 240); UIButton *oneButton = [[UIButton alloc] initWithFrame:CGRectMake(0, kHeaderHeight + 8, kScreenWidth,

  • iOS中键盘 KeyBoard 上添加工具栏的方法

    iOS中 键盘 KeyBoard 上怎么添加工具栏? 如图中所示 在键盘上面加一条工具栏 大致思路是提前创建好工具栏,在键盘弹出的时候将工具栏显示出来,在键盘消失的时候让工具栏隐藏 上代码 设置两个变量 UIView * _toolView; //工具栏 UITextField *textField;// 输入框 呼出键盘用 创建工具栏 输入框 添加键盘弹出 消失的通知 - (void)viewDidLoad { [super viewDidLoad]; // Do any additional

  • iOS应用开发中导航栏按钮UIBarButtonItem的添加教程

    1.UINavigationController导航控制器如何使用 UINavigationController可以翻译为导航控制器,在iOS里经常用到. 我们看看它的如何使用: 下面的图显示了导航控制器的流程.最左侧是根视图,当用户点击其中的General项时 ,General视图会滑入屏幕:当用户继续点击Auto-Lock项时,Auto-Lock视图将滑入屏幕.相应地,在对象管理上,导航控制器使用了导航堆栈.根视图控制器在堆栈最底层,接下来入栈的是General视图控制器和Auto-Lock

  • 详解iOS App开发中改变UIButton内部控件的基本方法

    UIButton内部默认有个UIImageView.UILabel控件,可以分别用下面属性访问: 复制代码 代码如下: @property(nonatomic,readonly,retain) UIImageView *imageView; @property(nonatomic,readonly,retain) UILabel     *titleLabel; UIButton之所以能显示文字,完全是因为它内部的titleLabel也,也就是说,UIButton的setTitle:forSta

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

    遇到过这种需求要做成类似与苹果删除软件时的动态效果. 1.长按抖动; 2.抖动时出现一个X; 3.点击x,删除button; 4.抖动时,点击按钮,停止抖动; 下面是我的设计思路: 1.继承UIButton: 2.给button在右上角添加一个按钮: 3.给button添加长按手势: 4.给button添加遮盖,抖动时可以拦截点击事件: 有更好的做法,还请斧正. // .m文件 #import "DZDeleteButton.h" #import "UIView+Extens

  • iOS实现图片抖动效果

    本文实例为大家分享了iOS实现图片抖动效果的具体代码,供大家参考,具体内容如下 效果图: 核心代码: // // ViewController.m // 图标抖动 // // Created by llkj on 2017/8/29. // Copyright © 2017年 LayneCheung. All rights reserved. // #import "ViewController.h" #define angle2Rad(angle) ((angle) / 180.0

  • jQuery Dialog 取消右上角删除按钮事件

    废话不多说了,直接给大家贴jquery dialog取消右上角删除按钮的代码了. 具体代码如下所示: $("#div1").dialog({ closeOnEscape:false, open:function(event,ui){$(".ui-dialog-titlebar-close").hide();} }); 以上所述是小编给大家介绍的jquery dialog 取消右上角删除按钮事件,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的.

  • iOS自定义键盘切换效果

    本文实例为大家分享了iOS自定义键盘切换的相关代码,供大家参考,具体内容如下 具体代码如下 - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. self.title = @"小飞哥键盘"; self.textField = [[UITextField alloc] initWithFrame:CGRectMa

  • IOS自定义UIButton九宫格效果

    此篇文章给大家描写如何写自定义九宫格,因为在开发中,这种需求也是常见不少.因此,主要利用UIButton阐述的: 实列不复杂,就两三个步骤完成: 一.定义宽度与高度(self.view) #define SCREEN_WIDTH [UIScreen mainScreen].bounds.size.width #define SCREEN_HEIGHT [UIScreen mainScreen].bounds.size.height #define JHRGB(r,g,b) [UIColor co

  • iOS实现支付宝蚂蚁森林随机按钮及抖动效果

    工作中遇到了一个需求 要做一个类似于蚂蚁森林的 在一定范围内随机出现 不相交且有上下抖动的控件 做完的图 如下 WechatIMG3.jpeg 这个需求在做的时候 需要注意几个地方 1.按钮随机且不相交 2.动画效果(核心动画) 3.需要监听点击事件和全部领取事件(全部领取完后会刷新接口) OK开始搞 随机按钮是其中最主要的两个点之一(上面的1和2) 在做的时候 需要注意范围 随机出现的控件 必须保证出现在上图的范围之内 那么随机x轴坐标和y轴坐标时 就需要注意 1.取值范围 Button的mi

  • iOS UISegmentControl实现自定义分栏效果

    本文实例为大家分享了iOS UISegmentControl实现自定义分栏效果的具体代码,供大家参考,具体内容如下 iOS 自带的UISegmentControl实现的就是类似上图的效果但是很多用处 一般这两个分栏是两个tableView,需要左右滑动来响应分栏 下面来讲述这样的效果是怎么实现的呢? 主要那里有一根短红线,需要滑动 来切换tableView 先自定义一个SegmentView .h //定义block,用来传递点击的第几个按钮 typedef void (^PassValueBl

  • iOS利用MJRefresh实现自定义刷新动画效果

    本文主要介绍iOS 利用MJRefresh实现自定义动画的上拉刷新下拉加载效果,一般的类型(包括更新时间与loading图案)这里不做介绍. 要想实现此功能,首先得有一套load的图片数组. 接下来就是实现过程: 引入头文件: #import "MJRefresh.h" //自定义一个方法实现 - (void)prepareRefresh { NSMutableArray *headerImages = [NSMutableArray array]; for (int i = 1; i

  • iOS自定义collectionView实现毛玻璃效果

    先来看看效果图,由于录屏软件不给力,毛玻璃效果不明显,请见谅. 步骤详解: 说下思路,很简单,首先自定义一个collectionView, 重写它的initWithFrame:collectionViewLayout:方法,在这里面做配置,这里用的是AXECollectionView. 与之对应的自定义一个collectionViewCell,在cell里配置操作:设置layer涂层,加载图片等操作,这里用的是AXECollectionViewCell. 最后在需要展示的控制器里调用AXECol

  • Android自定义button点击效果的两种方式

    我们在界面上经常会用到button按钮,但通常button点击后看不到点击的效果,如果用户连续点击了两次,就会报NAR错误,这样交互性就比较差了.如果我们自定义了button点击效果,比如我们点击了button能让我们看到我们确实点击了button按钮,这样就会有效的避免重复点击了. 自定义点击效果有两种方式,一种是在xml中定义,另一种是在代码中定义. 首先看一下如何在xml中定义: 在drawable下新建selector.xml文件: <?xml version="1.0"

随机推荐