在使用UIButton时,有时候需要调整按钮内部的imageView和titleLabel的位置和尺寸。在默认情况下,按钮内部的imageView和titleLabel的显示效果是图片在左文字在右,然后两者紧挨在一起构成组合居中显示。

如下图:

ios UILabel 上下边距 uilabel文字位置_ios UILabel 上下边距

我们可以使用setImageEdgeInsets:和setTitleEdgeInsets:方法来调整两者的位置。在使用这两个方法之前,我们首先要将imageView和titleLabel定位在UIButton的左上角位置,方便参照坐标调节位置。使用以下语句来定位(UIButton实例名为btn):



[btn setContentHorizontalAlignment: UIControlContentHorizontalAlignmentLeft];
[btn setContentVerticalAlignment: UIControlContentVerticalAlignmentTop];



1、正常情况:

使用上面的方法,不进行任何操作,此时显示情况和坐标情况如下:

ios UILabel 上下边距 uilabel文字位置_处理方法_02

2,将imageview居中,将titlelabel左移至贴边:

使用下面方法来实现:



[btn setImageEdgeInsets: UIEdgeInsetsMake(0, (btn.bounds.size.width-btn.imageView.bounds.size.width)*0.5, 0, 0)];
    [btn setTitleEdgeInsets: UIEdgeInsetsMake(0, -btn.imageView.bounds.size.width, 0, 0)];



 

 

ios UILabel 上下边距 uilabel文字位置_ios UILabel 上下边距_03

3,是imageview和titlelabel都居中,使用下面的方法来实现这种情况:



[btn setImageEdgeInsets: UIEdgeInsetsMake(0, (btn.bounds.size.width-btn.imageView.bounds.size.width)*0.5, 0, 0)];
    [btn setTitleEdgeInsets: UIEdgeInsetsMake(btn.imageView.bounds.size.height, (btn.bounds.size.width-btn.titleLabel.bounds.size.width)*0.5-btn.imageView.bounds.size.width, 0, 0)];



ios UILabel 上下边距 uilabel文字位置_移动开发_04

4,这是如果imageview的尺寸被压缩,使用下面的语句来讲imageview压缩下:



#define kImageWidth 100.
    [btn setImageEdgeInsets: UIEdgeInsetsMake(0, (btn.bounds.size.width-kImageWidth)*0.5, btn.bounds.size.height-kImageWidth, (btn.bounds.size.width-kImageWidth)*0.5)];
    [btn setTitleEdgeInsets: UIEdgeInsetsMake(btn.imageView.bounds.size.height, (btn.bounds.size.width-btn.titleLabel.bounds.size.width)*0.5-btn.imageView.bounds.size.width, 0, 0)];



会出现以下情况:

ios UILabel 上下边距 uilabel文字位置_ios UILabel 上下边距_05

这个时候,可以看出来titlabel不居中了,这说明在使用了setImageEdgeInsets:方法后,imageView的尺寸会被改变。

那么为何titleLabel在水平方向上还会偏移呢?原因是这样的,我们一直把titleLabel的初始x值和imageView的宽度等同看待了。而在这里imageView的宽度变小了,但是titleLabel的初始x值仍然是等于缩小前的imageView的宽度的,我们却使用一个缩小后的imageView的宽度来代替titleLabel的初始x值,于是导致了偏移的出现。

要处理这种情况,有两种方法:

5、处理方法1,先定义titleLabel再定义imageView:

    使用以下语句来实现这种情况:



#define kImageWidth 100.
    [btn setTitleEdgeInsets: UIEdgeInsetsMake(kImageWidth, (btn.bounds.size.width-btn.titleLabel.bounds.size.width)*0.5-btn.imageView.bounds.size.width, 0, 0)];
    [btn setImageEdgeInsets: UIEdgeInsetsMake(0, (btn.bounds.size.width-kImageWidth)*0.5, btn.bounds.size.height-kImageWidth, (btn.bounds.size.width-kImageWidth)*0.5)];



此时按钮的显示情况和坐标情况如下:

ios UILabel 上下边距 uilabel文字位置_#define_06

由于titleLabel在imageView被压缩前就使用了它的宽度来定位,所以能准确定位,也不会被之后的imageView压缩所影响。

 

6、处理方法2,先将imageView形变前的宽度记录下来:

    使用以下语句来实现这种情况:



#define kImageWidth 100.
    CGFloat imageWidth = btn.imageView.bounds.size.width;
    [btn setImageEdgeInsets: UIEdgeInsetsMake(0, (btn.bounds.size.width-kImageWidth)*0.5, btn.bounds.size.height-kImageWidth, (btn.bounds.size.width-kImageWidth)*0.5)];
    [btn setTitleEdgeInsets: UIEdgeInsetsMake(btn.imageView.bounds.size.height, (btn.bounds.size.width-btn.titleLabel.bounds.size.width)*0.5-imageWidth, 0, 0)];



ios UILabel 上下边距 uilabel文字位置_处理方法_07

7,另外,如果想将imageView放大,比如将imageView的宽度定为180,那么会有以下情况:

ios UILabel 上下边距 uilabel文字位置_#define_08

可以发现,imageView的尺寸还是150x150,并没有没放大,反而imageView的居中受到了影响,产生偏移了。

 

8、经过上面的测试,可以得到以下结论:

(1)、在UIButton中,titleLabel的初始x值是imageView的宽度;

(2)、imageView可以被压缩;

(3)、当imageView被压缩后,imageView的宽度会变小,此时就不可以再用imageView的宽度来代替titleLabel的初始x值来调整位置了;

(4)、imageView不可以被放大。