iOS开发怎样让button可以实现抖动效果

来源:爱站网时间:2021-12-24编辑:网友分享
很多朋友都会iOS开发充满了兴趣,为了让大家更好的理解清楚,爱站技术频道小编在此为大家整理了关于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(@"已经删除,要做什么事");

}

以上就是本文的全部内容,希望对大家的学习有所帮助。想要在iOS自定义button抖动效果并实现右上角删除按钮很简单,按照爱站技术频道小编整理出来的文章操作就行。

上一篇:IOS开发中如何应付Socket出现的错误

下一篇:使用iOS开发app音频文件播放

您可能感兴趣的文章

相关阅读

热门软件源码

最新软件源码下载