UIButton的titleEdgeInset 属性以及imageEdgeInsets属性
项目中每次使用到UIButton这个空间的时候最纠结的就是这两个属性
titleEdgeInset
```和``` imageEdgeInsets```,这次在项目中又碰到这个问题,我觉的是时候彻底解决它了(哼,说的好像这次总结你能记得住一样)。
设计稿给出的按钮中图片和文本的布局可能是:左右结构、右左结构、上下结构、下上结构;(反正看他们的心情喽)。本文就已上下结构(图上文本下,且整体居中)为例说明一下这两个属性的关系
初始化一个按钮实例,添加到view上,不做任何操作按钮的显示状态是这样的(本例默认```button.frame.size.width > button.imageView.frame.size.width + button.titleLab.frame.size.width```,其他情况类似)
![原始状态按钮](https://img.haomeiwen.com/i1984256/5044c6aa1bbec684.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
> button.imageView 和 button.titleLab 整体为什么只居中显示?
初始化状态下的UIButton实例默认的事整体居中显示,这取决于UIButton的.contentHorizontalAlignment 和contentVerticalAlignment两个属性。这两个属性是枚举类型,分别有对应`UIControlContentHorizontalAlignmentTop`、`UIControlContentHorizontalAlignmentLeft`、`UIControlContentHorizontalAlignmentBottom`、`UIControlContentHorizontalAlignmentRight`和`UIControlContentVerticalAlignmentTop`、`UIControlContentVerticalAlignmentLeft`、`UIControlContentVerticalAlignmentBottom`、`UIControlContentVerticalAlignmentRight`
不同的组合对应不同的状态,系统默认的是居中。所以改变`button.imageView`和`button.titleLab`的位置之前,先设置成我们熟悉的坐标参考系,以按钮的左上方为原点;
即 `button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
button.contentVerticalAlignment = UIControlContentVerticalAlignmentTop;`
设置好之后在运行代码按钮就变成这样的了
![设置属性之后](https://img.haomeiwen.com/i1984256/dff52c8fdb9b8308.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
但是我们的目的是让他变成这样
![最终状态](https://img.haomeiwen.com/i1984256/024d56889e72499b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
所以还需要设置button的`UIButton的titleEdgeInset 属性以及imageEdgeInsets属性`,现在只是做简单的平移就好了,具体平移多少现在是不是容易YY点。
具体平移多少看代码
`//Button中imageView 宽度及高度
CGFloat imageViewW = CGRectGetWidth(button.imageView.frame);
CGFloat imageViewH = CGRectGetHeight(button.imageView.frame);
//Button中titleLab 宽度及高度
CGFloat titleLabW = CGRectGetWidth(button.titleLabel.frame);
CGFloat titleLabH = CGRectGetHeight(button.titleLabel.frame);
//Button的宽度及高度
CGFloat buttonW = CGRectGetWidth(button.frame);
CGFloat buttonH = CGRectGetHeight(button.frame);
//需要设置imageEdgeInsets 的Top以及Left
CGFloat imageViewTop = (buttonH - imageViewH - titleLabH - 10) / 2;
CGFloat imageViewLeft = (buttonW - imageViewW) / 2;
//需要设置titleEdgeInsets 的Top以及Left 加10的原因是图片和文本的间隔为10
CGFloat titleLabTop = (imageViewTop + imageViewH) + 10;
//lab的左边界是相对于图片的左边界而言的,所以要减去imageViewW
CGFloat titleLabLeft = (buttonW - titleLabW) / 2 - imageViewW;
button.titleEdgeInsets = UIEdgeInsetsMake(titleLabTop, titleLabLeft, 0, 0);
button.imageEdgeInsets = UIEdgeInsetsMake(imageViewTop, imageViewLeft, 0, 0);`
如此就达到了我的目的...
网友评论