美文网首页
让人又爱又恨,欲罢不能的控件——UIButton

让人又爱又恨,欲罢不能的控件——UIButton

作者: 恋_时光 | 来源:发表于2017-12-04 21:03 被阅读0次

一、又爱又恨

UIButton是iOS开发中十分常用的控件,使用它有很多优势:

1、它继承自UIControl,支持多种事件,能够很灵活的根据不同的事件作出不同的响应;

2、它支持多种状态,可以设置不同状态的相关属性,尤其是对高亮的支持,能够让用户感觉到按钮被按到了,极大提升了用户的体验;

3、它可以同时支持文本和图片。

但是,它对图片和文本排列样式的支持不太友好。

它默认的样式是image在左,title在右, 中间没有间距,如果使用自动布局,它返回的固有大小刚好包裹内容,没有边框。

而在实际开发中,我们常常需要一个其他样式的button, 例如,image在上,title在下,中间需要10个像素的间距。

UIButton提供了 contentEdgeInsets、titleEdgeInsets、imageEdgeInsets几个属性,用来调整title和image的位置,从而支持其他的样式。

很多小伙伴的痛处就在于,找不到contentEdgeInsets、titleEdgeInsets、imageEdgeInsets对image和title位置影响的规律,不知道如何设置这几个属性来达到想要的效果,有时候可能费了九牛二虎之力,终于调到了想要的样式,却发现点击按钮靠边缘的的放无法响应点击事件。

二、欲罢不能

对于上面的需求,很多小伙伴可能会放弃UIButton, 自己通过一个UIImageView和一个UILabel加上一个UITapGestureRecognizer写一个Button,这样在功能上满足了需求,但是按下没有高亮效果,用户体验差,要实现对多种状态的支持,也是一件相当麻烦的事情。对于我这种特别懒的人,果断抛弃这样的想法。

三、爱上UIButton,不再嫌弃

UIButton默认的样式是这样的: 屏幕快照 2017-12-04 20.11.43.png

绿色的是Button的边框,橘红色的是image的边框, 蓝色的是title的边框。

contentEdgeInsets、titleEdgeInsets、imageEdgeInsets这三个属性都是相对于默认位置(即上图中的位置)而言的,向内为正,向外为负。

1、imageEdgeInsets:根据上面的理论, imageEdgeInsets的top分量是相对于image顶部的偏移量,向下为正,向上为负数;left分量是相对于image左边的偏移量,向右为正,向左为负;bottom是相对于image底部的偏移量,向上为正,向下为负;right是相对于image右边的偏移量,向左为正,向右为负;

2、titleEdgeInsets:与imageEdgeInsets一样

3、contentEdgeInset:与imageEdgeInsets一样, UIButton的intrinsicContentSize会根据contentEdgeInset返回。

举个栗子:

现在要实现上面的:image在上, title在下, 中间10个点的距离

// 图片在竖直方向的偏移量(总高度 - 图片的高度)/ 2
CGFloat imageOffsetY = (titleSize.height + space) / 2;
// 图片在水平方向的偏移量(总宽度 - 图片的宽度)/ 2
CGFloat imageOffsetX = titleSize.width / 2;
self.imageEdgeInsets = UIEdgeInsetsMake(-imageOffsetY, imageOffsetX, imageOffsetY, -imageOffsetX);
            
CGFloat titleOffsetY = (imageSize.height + space) / 2;
CGFloat titleOffsetX = imageSize.width / 2;
self.titleEdgeInsets = UIEdgeInsetsMake(titleOffsetY, -titleOffsetX, -titleOffsetY, titleOffsetX);
现在效果是这样的: 屏幕快照 2017-12-04 20.55.22.png

可以看到, 在样式上面满足了要求,但是,button的frame不对,image和title超出了button的范围, 这也是上面提到的,点击边缘无法响应的原因。
下面我们调整contentEdgeInsets:

// contentInsets是设置的内容边框,现在都设为了0
CGFloat contentOffsetY = (titleSize.height + imageSize.height + space - MAX(titleSize.height, imageSize.height))  / 2;
            CGFloat contentOffsetX = (titleSize.width + imageSize.width - MAX(titleSize.width, imageSize.width)) / 2;
            self.contentEdgeInsets = UIEdgeInsetsMake(contentOffsetY + self.contentInsets.top, -contentOffsetX + self.contentInsets.left, contentOffsetY + self.contentInsets.bottom, -contentOffsetX + self.contentInsets.right);
效果如下: 屏幕快照 2017-12-04 21.00.11.png
可以看到,已经达到了要求, 下面再加上边距: 屏幕快照 2017-12-04 21.01.45.png

好啦,就写到这里了,希望小伙伴们都能爱上UIButton。欢迎一起交流、讨论!

相关文章

  • 让人又爱又恨,欲罢不能的控件——UIButton

    一、又爱又恨 UIButton是iOS开发中十分常用的控件,使用它有很多优势: 1、它继承自UIControl,支...

  • Android CoordinatorLayout(一) 初探C

    相信很多人用过CoordinatorLayout或了解过这个控件,这次我们来聊聊这个让人又爱又恨的控件。对我来说,...

  • 让人又爱又恨

    打扫卫生可真让人又爱又恨! 爱是说,喜欢这种亲手把杂乱的事物归纳整齐的感觉,很有成就感哇! 恨是说,好累啊……打扫...

  • redux让人又爱又恨

    快照:关于指定数据集合的一个完全可用拷贝,该拷贝包括相应数据在某个时间点(拷贝开始的时间点)的映像。快照可以是其所...

  • 此路让人又爱又恨

    海誓山盟没用处,还得金山银海填. 自古深情留不住,总是套路得人心。 现在套路这个词已经被人们玩坏了,貌似对一般人来...

  • 时间,让人又爱又恨

    五一三天,过的太神速,还没好好享受就这样结束了。 还想着4.30那天盯着手机期盼,没想现已快结束。 时间真的有时候...

  • 时光,让人又爱又恨

    一晃眼具体的两年过去了,从不成熟的心智,开始慢慢懂事。自己还是变成了小时候不愿成为的人,毫无特长,且不自知。...

  • 预设,让人又爱又恨

    前天偶然间我点开了思达帕特的微信公众号,里面有一集鹿晗经纪人杨天真的采访,印象最深刻的是杨天真说她从来不进行预设,...

  • 冬雾,让人又爱又恨

    图| 淸凉地儿-了琹 © 物道君语:生活如冬雾,雾起雨雪不休,雾散旭日可求。 中国有句话说:“春雾日头,夏雾雨,秋...

  • 手机,让人又爱又恨。

    在这个智能的时代,就算是意识到手机上的每个应用和那些小红点,不仅仅是单纯的让我们点击,而是在争夺我们的时间,浪费我...

网友评论

      本文标题:让人又爱又恨,欲罢不能的控件——UIButton

      本文链接:https://www.haomeiwen.com/subject/tqrfixtx.html