iOS (UIButton封装)仿糯米首页缩放“按钮”效果

前言

过年期间,少不了各种聚会,当下聚会大多数情况下自然是团购,然后就是用各种APP。。。使用度娘糯米时(不是广告,不是广告,不是广告!),偶然注意到了它的首页中一个有意思的效果,就是那些“按钮”点击时的缩放动画,有一种“按下去”的赶脚,恰逢前阵子做过一个录音按钮的“点动”效果,忍不住便封装了这个按钮效果:GitHub

动态缩放按钮,“按下去”的效果

demo中的按钮背景图片截取自度娘糯米首页,仅供学习参考!

糯米首页应该是collectionView布局吧?也许,这里只是纯粹实现效果,封装了系统的按钮。
关于这个效果,首先不得不提一个概念——点动。

1.关于“点动”按钮

点动这一概念,我是从硬件那边搬过来的。
曾经做单片机时,按键是一个很重要的外设,硬件按键在编写代码实现功能时,一般有两种效果:带锁按钮,不带锁按钮。
所谓带锁按钮,就是点击按钮之后立刻松手,就能实现对应功能,例如我们曾经用过的按键手机的数字键都是这样的。
所谓不带锁按钮,也就是这里要说的“点动”,顾名思义,就是点击就动,松手即停。单片机那边一般在电机控制什么的场景经常用到,在我们软件这边,较普遍的一个应用场景就是“录音按钮”(微信语音神马的)。
录音按钮在点击时进行录音,一旦松手,录音就会停止。
为了便于说明,写了以下效果进行演示,button的showsTouchWhenHighlighted属性打开以指示按钮正在被点击中。

点动按钮效果

2.实现“点动”按钮

实现按钮的“点动”其实很简单:

//按下时
[myButton addTarget:self 
           action:@selector(pressedEvent:) 
 forControlEvents:UIControlEventTouchDown];
//松手后
[myButton addTarget:self 
           action:@selector(unpressedEvent:) 
 forControlEvents:UIControlEventTouchUpInside | UIControlEventTouchUpOutside];

接下来在按钮的点击响应实现中:

- (void)pressedEvent:(id)sender

实现的是按钮按下的响应,例如录音开始并持续。

- (void)unpressedEvent:(id)sender

则实现的是松开按钮(停止点击)时的响应,此时执行结束录音。

两个响应结合起来,也就实现了硬件按钮的“点动”效果(硬件按键是根据高低电平判定的,所以代码实现十分简单,对单片机有兴趣的朋友可以查阅相关资料,不过硬件按键按下时的电平“抖动”则是十分令人头疼的问题)。

这里还要提一点,就是ControlEvents,这里写的是UIControlEventTouchUpInside | UIControlEventTouchUpOutside,意思就是在按钮区域范围内或者范围外(按下之后,手指移动拖移)松手(停止点击),都会执行“松手响应”,这在一些情况下要注意区分,例如接下来要实现的“缩放按钮”。如果我们只写UIControlEventTouchUpInside,那么,我们在按钮区域范围外松手,也就是点击之后,手指拖动,移到按钮frame外,unpressedEvent响应是不执行的,我们从而也就实现了一个“取消”效果,当然这个不是用在录音按钮中的。

3.动画缩放按钮

前面啰嗦了一大堆,现在切入正题,其实,正题也就没什么要说的了,实现糯米的这一效果,无非还是上面的“动作拆分”思想,我们只要将按钮按下的缩放动画,以及动画执行之后的真正的响应,分别写在两个响应函数中就可以了。

//按钮的按下事件 按钮缩小
- (void)pressedEvent:(JXTPushInButton *)btn
{
  //缩放比例必须大于0,且小于等于1
  CGFloat scale = (_buttonScale && _buttonScale <=1.0) ? _buttonScale : defaultScale;//defaultScale默认为0.9

  [UIView animateWithDuration:animateDelay animations:^{
      btn.transform = CGAffineTransformMakeScale(scale, scale);
  }];
}
//按钮的松开事件 按钮复原 执行响应
- (void)unpressedEvent:(JXTPushInButton *)btn
{
  [UIView animateWithDuration:animateDelay animations:^{
      btn.transform = CGAffineTransformMakeScale(1.0, 1.0);
  } completion:^(BOOL finished) {
      //执行动作响应
      if (self.clickBlock) {
          self.clickBlock();
      }
  }];
}

按钮按下真正要执行的响应,封装在了block中,button的封装详见我传到github中的代码,调用很方便,还是一句话:

JXTPushInButton * btn = [JXTPushInButton touchUpOutsideCancelButtonWithType:UIButtonTypeCustom frame:CGRectMake(0, 0, ScreenWidth - 20, 80) title:@"按钮-1" titleColor:[UIColor blackColor] backgroundColor:[UIColor redColor] backgroundImage:nil andBlock:^{
    NSLog(@"frame内部松手执,行按钮-1");
}];
[self.view addSubview:btn];

参考文章:
1.UIButton---按住录音,松开停止
2.iOS下UIButton压下后播放动画,松开后动画消失的实现

·转载请注明出处·

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,425评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,058评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,186评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,848评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,249评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,554评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,830评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,536评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,239评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,505评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,004评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,346评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,999评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,060评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,821评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,574评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,480评论 2 267

推荐阅读更多精彩内容