UIButton中imageView和titleLabel的位置調(diào)整

在使用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不可以被放大。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市危彩,隨后出現(xiàn)的幾起案子攒磨,更是在濱河造成了極大的恐慌,老刑警劉巖汤徽,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件娩缰,死亡現(xiàn)場離奇詭異,居然都是意外死亡谒府,警方通過查閱死者的電腦和手機(jī)拼坎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來完疫,“玉大人泰鸡,你說我怎么就攤上這事】呛祝” “怎么了盛龄?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長器虾。 經(jīng)常有香客問我讯嫂,道長,這世上最難降的妖魔是什么兆沙? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任欧芽,我火速辦了婚禮,結(jié)果婚禮上葛圃,老公的妹妹穿的比我還像新娘千扔。我一直安慰自己,他們只是感情好库正,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布曲楚。 她就那樣靜靜地躺著,像睡著了一般褥符。 火紅的嫁衣襯著肌膚如雪龙誊。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天喷楣,我揣著相機(jī)與錄音趟大,去河邊找鬼。 笑死铣焊,一個(gè)胖子當(dāng)著我的面吹牛逊朽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播曲伊,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼叽讳,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起岛蚤,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤邑狸,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后灭美,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體推溃,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年届腐,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了铁坎。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,040評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡犁苏,死狀恐怖硬萍,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情围详,我是刑警寧澤朴乖,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站助赞,受9級特大地震影響买羞,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜雹食,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一畜普、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧群叶,春花似錦吃挑、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至赎离,卻和暖如春逛犹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背梁剔。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工圾浅, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓乍迄,卻偏偏與公主長得像辆床,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子讨越,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容