在使用UIButton時(shí)蚁袭,有時(shí)候需要調(diào)整按鈕內(nèi)部的imageView和titleLabel的位置和尺寸黎炉。在默認(rèn)情況下玷室,按鈕內(nèi)部的imageView和titleLabel的顯示效果是圖片在左文字在右桃煎,然后兩者緊挨在一起構(gòu)成組合居中顯示篮幢。如下圖:
我們可以使用setImageEdgeInsets:
和setTitleEdgeInsets:
方法來調(diào)整兩者的位置。在使用這兩個(gè)方法之前为迈,我們首先要將imageView和titleLabel定位在UIButton的左上角位置三椿,方便參照坐標(biāo)調(diào)節(jié)位置。使用以下語句來定位(UIButton實(shí)例名為btn):
[btn setContentHorizontalAlignment: UIControlContentHorizontalAlignmentLeft];
[btn setContentVerticalAlignment: UIControlContentVerticalAlignmentTop];
另外需要說明曲尸,btn的高度為200赋续、寬度為屏幕寬度,imageView的圖片的原本尺寸為150x150另患,titleLabel使用了sizeToFit:
方法纽乱。在定義后,我們分多種情況來討論imageView和titleLabel的位置:
1昆箕、正常情況:
使用了上述的語句后鸦列,不進(jìn)行任何操作,此時(shí)按鈕的顯示情況和坐標(biāo)情況如下:
imageView.x=0.000000, imageView.y=0.000000, imageView.width=150.000000, imageView.height=150.000000
titleLabel.x=150.000000, titleLabel.y=0.000000, titleLabel.width=180.500000, titleLabel.height=21.500000
可以看到:titleLabel的x值是150鹏倘,說明普通狀態(tài)下薯嗤,titleLabel的原點(diǎn)是(150 ,0)。
2纤泵、將imageView居中骆姐,將titleLabel左移至貼邊:
使用以下語句來實(shí)現(xiàn)這種情況:
[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)];
此時(shí)按鈕的顯示情況和坐標(biāo)情況如下:
可以看到,imageView和titleLabel兩者是有可能重疊的捏题,并且titleLabel的x值確實(shí)是imageView的寬度玻褪。
3、使imageView和titleLabel都居中:
使用以下語句來實(shí)現(xiàn)這種情況
[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)];
此時(shí)按鈕的顯示情況和坐標(biāo)情況如下:
imageView.x=112.500000, imageView.y=0.000000, imageView.width=150.000000, imageView.height=150.000000
titleLabel.x=97.250000, titleLabel.y=150.000000, titleLabel.width=180.500000, titleLabel.height=21.500000
此時(shí)一切正常公荧,符合猜想带射。
4、這時(shí)如果imageView的尺寸被壓縮:
使用以下語句來將imageView壓縮成100x100:
#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)];
此時(shí)按鈕的顯示情況和坐標(biāo)情況如下:
imageView.x=137.500000, imageView.y=0.000000, imageView.width=100.000000, imageView.height=100.000000
titleLabel.x=147.250000, titleLabel.y=100.000000, titleLabel.width=180.500000, titleLabel.height=21.500000
可以發(fā)現(xiàn)循狰,問題出現(xiàn)了窟社,此時(shí)titleLabel在水平方向上不再居中了。但是我們同時(shí)可以發(fā)現(xiàn)绪钥,titleLabel在垂直方向上的位置仍然是正確的灿里,并且可以看到titleLabel.y=100
。這說明在使用了setImageEdgeInsets:
方法后昧识,imageView的尺寸會被改變钠四。
那么為何titleLabel在水平方向上還會偏移呢?原因是這樣的,我們一直把titleLabel的初始x值和imageView的寬度等同看待了缀去。而在這里imageView的寬度變小了侣灶,但是titleLabel的初始x值仍然是等于縮小前的imageView的寬度的,我們卻使用一個(gè)縮小后的imageView的寬度來代替titleLabel的初始x值缕碎,于是導(dǎo)致了偏移的出現(xiàn)褥影。
要處理這種情況,有兩種方法:
5咏雌、處理方法1凡怎,先定義titleLabel再定義imageView:
使用以下語句來實(shí)現(xiàn)這種情況:
#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)];
此時(shí)按鈕的顯示情況和坐標(biāo)情況如下:
imageView.x=137.500000, imageView.y=0.000000, imageView.width=100.000000, imageView.height=100.000000
titleLabel.x=97.250000, titleLabel.y=100.000000, titleLabel.width=180.500000, titleLabel.height=21.500000
由于titleLabel在imageView被壓縮前就使用了它的寬度來定位,所以能準(zhǔn)確定位赊抖,也不會被之后的imageView壓縮所影響统倒。
6、處理方法2氛雪,先將imageView形變前的寬度記錄下來:
使用以下語句來實(shí)現(xiàn)這種情況:
#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)];
此時(shí)按鈕的顯示情況和坐標(biāo)情況如下:
imageView.x=137.500000, imageView.y=0.000000, imageView.width=100.000000, imageView.height=100.000000
titleLabel.x=97.250000, titleLabel.y=100.000000, titleLabel.width=180.500000, titleLabel.height=21.500000
先將imageView的寬度記錄下來房匆,用作titleLabel的初始x值,那么之后imageView的壓縮就不會再影響到這個(gè)值了报亩。
7浴鸿、另外,如果想將imageView放大弦追,比如將imageView的寬度定為180岳链,那么會有以下情況:
imageView.x=97.500000, imageView.y=0.000000, imageView.width=150.000000, imageView.height=150.000000
titleLabel.x=97.250000, titleLabel.y=150.000000, titleLabel.width=180.500000, titleLabel.height=21.500000
可以發(fā)現(xiàn),imageView的尺寸還是150x150劲件,并沒有沒放大掸哑,反而imageView的居中受到了影響,產(chǎn)生偏移了零远。
8举户、經(jīng)過上面的測試,可以得到以下結(jié)論:
- (1)遍烦、在UIButton中,titleLabel的初始x值是imageView的寬度躺枕;
- (2)服猪、imageView可以被壓縮;
- (3)拐云、當(dāng)imageView被壓縮后罢猪,imageView的寬度會變小,此時(shí)就不可以再用imageView的寬度來代替titleLabel的初始x值來調(diào)整位置了叉瘩;
- (4)膳帕、imageView不可以被放大。