全國(guó)服務熱線:0551-64931480

10
20-01

UIButton中imageView和titleLabel的位置調整

雲庫科技 766942 0

在使用UIButton時,有時候需要調整按鈕内部的imageView和titleLabel的位置和尺寸。在默認情況下,按鈕内部的imageView和titleLabel的顯示效果是圖片在左文字在右,然後(hòu)兩(liǎng)者緊挨在一起(qǐ)構成(chéng)組合居中顯示。如下圖:

我們可以使用setImageEdgeInsets:setTitleEdgeInsets:方法來調整兩(liǎng)者的位置。在使用這(zhè)兩(liǎng)個方法之前,我們首先要將(jiāng)imageView和titleLabel定位在UIButton的左上角位置,方便參照坐标調節位置。使用以下語句來定位(UIButton實例名爲btn):

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

另外需要說明,btn的高度爲200、寬度爲屏幕寬度,imageView的圖片的原本尺寸爲150x150,titleLabel使用了sizeToFit:方法。在定義後(hòu),我們分多種(zhǒng)情況來讨論imageView和titleLabel的位置:

1、正常情況:

使用了上述的語句後(hòu),不進(jìn)行任何操作,此時按鈕的顯示情況和坐标情況如下:

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,說明普通狀态下,titleLabel的原點是(150 ,0)。

2、將(jiāng)imageView居中,將(jiāng)titleLabel左移至貼邊:

使用以下語句來實現這(zhè)種(zhǒng)情況:

[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)];  

此時按鈕的顯示情況和坐标情況如下:

可以看到,imageView和titleLabel兩(liǎng)者是有可能(néng)重疊的,并且titleLabel的x值确實是imageView的寬度。

3、使imageView和titleLabel都(dōu)居中:

使用以下語句來實現這(zhè)種(zhǒng)情況

[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)];  

此時按鈕的顯示情況和坐标情況如下:

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  

此時一切正常,符合猜想。

4、這(zhè)時如果imageView的尺寸被(bèi)壓縮:

使用以下語句來將(jiāng)imageView壓縮成(chéng)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)];  

此時按鈕的顯示情況和坐标情況如下:

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ā)現,問題出現了,此時titleLabel在水平方向(xiàng)上不再居中了。但是我們同時可以發(fā)現,titleLabel在垂直方向(xiàng)上的位置仍然是正确的,并且可以看到titleLabel.y=100。這(zhè)說明在使用了setImageEdgeInsets:方法後(hòu),imageView的尺寸會(huì)被(bèi)改變。
那麼(me)爲何titleLabel在水平方向(xiàng)上還(hái)會(huì)偏移呢?原因是這(zhè)樣(yàng)的,我們一直把titleLabel的初始x值和imageView的寬度等同看待了。而在這(zhè)裡(lǐ)imageView的寬度變小了,但是titleLabel的初始x值仍然是等于縮小前的imageView的寬度的,我們卻使用一個縮小後(hòu)的imageView的寬度來代替titleLabel的初始x值,于是導緻了偏移的出現。
要處理這(zhè)種(zhǒng)情況,有兩(liǎng)種(zhǒng)方法:

5、處理方法1,先定義titleLabel再定義imageView:

使用以下語句來實現這(zhè)種(zhǒng)情況:

#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)];  

此時按鈕的顯示情況和坐标情況如下:

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被(bèi)壓縮前就使用了它的寬度來定位,所以能(néng)準确定位,也不會(huì)被(bèi)之後(hòu)的imageView壓縮所影響。

6、處理方法2,先將(jiāng)imageView形變前的寬度記錄下來:

使用以下語句來實現這(zhè)種(zhǒng)情況:

#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)];  

此時按鈕的顯示情況和坐标情況如下:

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  

先將(jiāng)imageView的寬度記錄下來,用作titleLabel的初始x值,那麼(me)之後(hòu)imageView的壓縮就不會(huì)再影響到這(zhè)個值了。

7、另外,如果想將(jiāng)imageView放大,比如將(jiāng)imageView的寬度定爲180,那麼(me)會(huì)有以下情況:

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ā)現,imageView的尺寸還(hái)是150x150,并沒(méi)有沒(méi)放大,反而imageView的居中受到了影響,産生偏移了。

8、經(jīng)過(guò)上面(miàn)的測試,可以得到以下結論:

  • (1)、在UIButton中,titleLabel的初始x值是imageView的寬度;
  • (2)、imageView可以被(bèi)壓縮;
  • (3)、當imageView被(bèi)壓縮後(hòu),imageView的寬度會(huì)變小,此時就不可以再用imageView的寬度來代替titleLabel的初始x值來調整位置了;
  • (4)、imageView不可以被(bèi)放大。
評論列表(0)
暫無評論

發(fā)表評論 取消回複