自定义按钮的优雅封装 – Swift

自定义按钮的优雅封装 – Swift目录 1.自定义按钮解决了什么问题 2.封装思路与踩的坑 3.使用效果 3.源码和demon地址 1.自定义按钮解决了什么问题 一行代码设置图片与文本位置(文本在图片左边/右边/上面/下面) 一行代码

目录

1.自定义按钮解决了什么问题
2.封装思路与踩的坑
3.使用效果
4.源码和demon地址


1.自定义按钮解决了什么问题

  • 一行代码设置图片与文本位置(文本在图片左边/右边/上面/下面)
  • 一行代码设置图片与文本间距
  • 一行代码添加渐变色背景,设置点击高亮渐变色效果
  • 阴影、圆角、渐变色同时存在

解决以上问题我们仅仅使用系统按钮去开发,需要写很多代码而且容易出bug,所以需要封装一个按钮达到一劳永逸的效果。

2.封装思路与踩的坑

1.封装的按钮是继承UIButton还是继承UIControl

刚开始写是继承UIButton,然而在insert渐变色layer时,需要处理UIbutton的titleLabel和imageView的layer和渐变色layer的层级问题,保证渐变色layer在最上面才能显示渐变色,稍显麻烦,高亮效果也不好,而且感觉UIButton有点重,所以选择继承UIControl,写一个全新的按钮。

2.图片与文本位置样式和间距

这个重写layoutSubviews方法,在里面计算出合适的位置即可,但是调用时机需要考虑全面一点,比如文本改动,文本字体改动,图片改动,布局类型改动等都需要去更新布局。 主要实现代码如下:

Snipaste_2021-11-02_12-34-26.png Snipaste_2021-11-02_12-35-52.png

3.如何设置渐变色

  • plan A: 最开始是重写系统绘制方法draw(_ rect: CGRect),绘制一个渐变色,刚开始也没发现问题,然而在实际开发的项目中发现,cllectionview的cell里面放Button,cell很多的情况下按钮没法正常显示了,只要重写draw(_ rect: CGRect)就会有问题 😭 😭
  • plan B:使用CAGradientLayer创建一个图层,插入到按钮的图层中,传参做相应处理,各种场景测试没发现bug。 主要代码如下:

Snipaste_2021-11-02_14-22-28.png

4.如何优雅设置渐变色圆角

  • 如果Button没有阴影那么使用masksToBounds切圆角是完全ok的
  • 然鹅有时候,UI设计阴影、圆角、渐变色同时存在,那么我们除了要给Button设置圆角,还要给渐变色layer设置圆角,我这里直接利用了KVC获取Button圆角给渐变色layer设置,省去了传参赋值的麻烦。主要代码如下:

Snipaste_2021-11-03_11-46-33.png

5.点击高亮状态设置(旧的实现,实际效果不太好,快速点击/轻触不会有高亮色,UI直接过不了😭😭)

主要是重写点击响应三个方法
touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?)
touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?)
touchesEnded(_ >touches: Set<UITouch>, > with event: UIEvent?)
touchesBegan 保存原有颜色,赋值高亮色,touchesCancelled、touchesEnded还原原有颜色即可

Snipaste_2022-05-25_17-00-01.png

5.1 改良版的点击态效果:

主要是重写点击响应四个方法
hitTest(_ point: CGPoint, with event: UIEvent?)
touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?)
touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?)
touchesEnded(_ >touches: Set<UITouch>, > with event: UIEvent?)
主要在hitTest方法里面处理,实时响应,添加一个高亮layer,结合延时共同处理,点击响应高亮效果非常nice👌👌。

Snipaste_2022-05-25_17-07-12.png

3.使用效果

  • 上面的问题解决后,现在看看实现一个布局样式+阴影+圆角+渐变色按钮的代码:

Snipaste_2021-11-02_14-49-39.png

常用方法系统Button基本保持一致,其他需求基本一行代码搞定,是不是觉得非常方便呢~

下面是demon的展示效果~

08929ebe-ef8a-40dd-af1d-127fdb32de8c.gif

4.源码和demon地址

github地址

今天的文章自定义按钮的优雅封装 – Swift分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/18265.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注