基础概念

UIEdgeInsetsMake使用详解一文。

解疑

Q1:一个普通UIButton设置了Image和Title后,如下图1所示,要变成图2的样子,Image和Title分别需要在水平和竖直方向如何移动?
图1 UIButton默认样式
图2 UIButton目标样式

A:运用数学计算,不难得出:
Image需要:

  1. 向右移动Title宽度的一半
  2. 向上移动Title高度的一半
    Title需要:
  3. 向左移动Image宽度的一半
  4. 向上移动Image高度的一半

Q2:为什么UIEdgeInsetsMake设置的距离需要是数学计算出来的值的两倍呢?
A:原因就在于,UIEdgeInsetsMake(top, left, bottom, right)的四个值,都是元素的边界线的移动距离,而并非是元素的移动距离。

图3 边界线示意

现在固定左边界线移动右边界线,若右边界线往外移动2,那么元素实际上只向外移动了1(因为元素始终在四条边界线内区域的中心)。
所以现在我们不难得出结论,若要使元素移动距离x(无论是哪个方向上),在只移动该方向一条边界线的前提下,这条边界线需要移动2x才能满足需求。

Q2:如何实现需求?
A:

1
2
3
4
5
6
- (void)setButtonInsects:(UIButton *)button {
CGSize imgSize = button.imageView.frame.size;
CGSize titleSize = button.titleLabel.frame.size;
button.imageEdgeInsets = UIEdgeInsetsMake(-titleSize.height, 0, 0, -titleSize.width);
button.titleEdgeInsets = UIEdgeInsetsMake(0, -imgSize.width, - imgSize.height, 0);
}
  1. Image:将上边界往上调titleSize.height高度,将右边界往右调titleSize.width宽度。
  2. Title: 将左边界往左调imgSize.width宽度, 将下边界往下调imgSize.height高度。