登录 立即注册
金钱:

Code4App-iOS开发-iOS 开源代码库-iOS代码实例搜索-iOS特效示例-iOS代码例子下载-Code4App.com

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

[复制链接]
来自: 李世铿 分类: iOS精品源码 上传时间: 2016-4-25 10:43:26

项目介绍:

文/霖溦(简书作者)

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

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

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



1.gif

2.实现“点动”按钮
实现按钮的“点动”其实很简单:
[Objective-C] 查看源文件 复制代码
  //按下时
  [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.动画缩放按钮
前面啰嗦了一大堆,现在切入正题,其实,正题也就没什么要说的了,实现糯米的这一效果,无非还是上面的“动作拆分”思想,我们只要将按钮按下的缩放动画,以及动画执行之后的真正的响应,分别写在两个响应函数中就可以了。
[Objective-C] 查看源文件 复制代码
  //按钮的按下事件 按钮缩小
  - (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中的代码,调用很方便,还是一句话:
[Objective-C] 查看源文件 复制代码
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];









相关源码推荐:

我来说两句
*滑动验证:
所有评论(102)
lihongqioan 2016-4-25 11:14:23
强烈支持楼主ing……
回复
qinglang 2016-4-25 17:40:19
我只是路过打酱油的。
回复
dongzhixiong 2016-4-25 18:19:30
淡定,淡定,淡定……
回复
千夏 2016-4-25 21:02:08
楼主威武啊,Code4App有你更给力!
回复
爱妻之光 2016-4-25 21:34:11
楼主用心了,内容非常精彩。
回复
危谷慕 2016-4-25 21:41:15
很给力,Code4App有你更精彩!
回复
春风动人 2016-4-26 09:55:14
正需要啊,感谢楼主无私分享!
回复
初冬 2016-4-26 11:49:15
学习学习!
回复
18356086792 2016-4-26 11:50:45
很给力,Code4App有你更精彩!
回复
提取码:  下载次数:159 状态:已购或VIP 售价:0(原价:5)金钱 下载权限:初级码农 
2503 2 159
联系我们
首页/微信公众账号投稿

帖子代码编辑/版权问题

QQ:435399051,742864542

如何获得代码达人称号?

代码贡献英雄榜
用户名 下载数
通过邮件订阅最新 Code4App 信息
上一条 /4 下一条
联系我们
关闭
合作电话:
13802416937
Email:
435399051@qq.com
商务市场合作/投稿
问题反馈及帮助
联系我们

广告投放| Github|申请友链|手机版|Code4App ( 粤ICP备15117877号-1 )

快速回复 返回顶部 返回列表