UIButton內(nèi)有兩個(gè)控件titleLabel和imageView,可以用來(lái)顯示一個(gè)文本和圖片,這里的圖片區(qū)別于背景圖片。給UIButton設(shè)置了title和image后,它們會(huì)圖片在左邊,文本在圖片右邊顯示。它們兩個(gè)做為一個(gè)整體依賴于button的
contentHorizontalAlignment居左居右或居中顯示。(默認(rèn)是居中)
當(dāng)button.width < image.width時(shí),只顯示被壓縮后的圖片,圖片是按fillXY的方式壓縮。
當(dāng)button.width > image.width,且 button.width < (image.width + text.width)時(shí),圖片正常顯示,文本被壓縮。
當(dāng)button.width > (image.width + text.width),兩者并列默認(rèn)居中顯示,可通過(guò)button的屬性contentHorizontalAlignment改變對(duì)齊方式。
想兩改變兩個(gè)子控件的顯示位置,可以分別通過(guò)setTitleEdgeInsets和setImageEdgeInsets來(lái)實(shí)現(xiàn)。 需要注意的是,對(duì)titleLabel和imageView設(shè)置偏移,是針對(duì)它當(dāng)前的位置起作用的,并不是針對(duì)它距離button邊框的距離的。
看到網(wǎng)上很多說(shuō) UIEdgeInsetsMake ( CGFloat top, CGFloat left, CGFloat bottom, CGFloat right ); 構(gòu)造出,分別表示其中的內(nèi)容/標(biāo)題/圖片離各邊的距離。剛開(kāi)始搞的很郁悶不知道為什么總是設(shè)置不對(duì)。可能是我理解錯(cuò)了吧,需要有空在看一下官方文檔了解一下UIEdgeInsetsMake
當(dāng)?shù)谌N情況的時(shí)候,button的contentHorizontalAlignment不同,我們?cè)O(shè)置UIEdgeInsetsMake的值也是不一樣的
button:width=150 image:width=24 label:width=102
1.button.contentHorizontalAlignment=UIControlContentHorizontalAlignmentCenter;時(shí) image離左邊的距離為(button.width-image.width-label.width)/2 = 12, 那么我們?cè)O(shè)置
[btn setImageEdgeInsets:UIEdgeInsetsMake(0, -12, 0, 0)];其實(shí)圖片只向左移了6。
當(dāng)[btn setImageEdgeInsets:UIEdgeInsetsMake(0, -24, 0, 0)];或
[btn setImageEdgeInsets:UIEdgeInsetsMake(0, -12, 0, 12)];
圖片才向左移了12
所以當(dāng)button的對(duì)齊方式為居中時(shí),對(duì)應(yīng)方向偏移的距離要乘2;
2.button.contentHorizontalAlignment=UIControlContentHorizontalAlignmentLeft;時(shí) image離左邊的距離為0,label離左邊的距離為image.width=24;
設(shè)置[btn setImageEdgeInsets:UIEdgeInsetsMake(0, 24, 0, 0)];
[btn setTitleEdgeInsets:UIEdgeInsetsMake(0, 24, 0, 0)];
圖片和文字都正確的向右移動(dòng)了24距離,而不用乘2
注意:位置的偏移是按最初的原始坐標(biāo)來(lái)算的,比如情況2圖片的原始坐標(biāo)為(0,0),title的原始坐標(biāo)為(24,0),偏移一次過(guò)后第二次偏移也是按照那個(gè)原始坐標(biāo)來(lái)算,而不是第一次偏移后的那個(gè)坐標(biāo)
我簡(jiǎn)單了寫(xiě)了個(gè)uibutton的分類,能簡(jiǎn)單的設(shè)置圖片離左邊的距離,和設(shè)置文字居中。
github:UIButtonDemo