UIButton中的titleEdgeInsets和imageEdgeInsets可以管理button中title和image的布局先舷。 如果對(duì)其理解不夠深入就轧,用純數(shù)字進(jìn)行布局管理粉怕,經(jīng)過不斷的調(diào)試十厢,還是能試出來的,但是如果改變了圖片大小或文字長度右核,又要再來一遍销凑。 作為程序猿丛晌,我們不應(yīng)該放棄任何一個(gè)偷懶的機(jī)會(huì)。
只設(shè)置image或title其中一項(xiàng)時(shí)斗幼,默認(rèn)是正常居中顯示的澎蛛,但我們同時(shí)設(shè)置image和title時(shí),則會(huì)出現(xiàn)如 <圖片1> 的問題孟岛,這是為什么呢瓶竭?那就是當(dāng)我們同時(shí)添加image和title時(shí)督勺,image默認(rèn)會(huì)向左偏移button的titleLabel的寬度,而title會(huì)向右偏移image的寬度斤贰,既然明白了原理智哀,我們就可以設(shè)置偏移量來達(dá)到我們想要的任何效果。
默認(rèn)情況下荧恍,圖片在左瓷叫,文字在右,垂直居中顯示送巡,如下圖:
button.titleEdgeInsets = UIEdgeInsetsZero;
button.imageEdgeInsets = UIEdgeInsetsZero;
設(shè)置如下布局后摹菠,圖片和文字都居中顯示。
button.titleEdgeInsets = UIEdgeInsetsMake(0, -button.imageView.frame.size.width, 0, 0);
// button.imageEdgeInsets = UIEdgeInsetsMake(0, 0, 0, -button.titleLabel.frame.size.width);
// 由于iOS8中titleLabel的size為0骗爆,用上面這樣設(shè)置有問題次氨,修改一下即可
button.imageEdgeInsets = UIEdgeInsetsMake(0, 0, 0, -button.titleLabel.intrinsicContentSize.width);
如果想圖片在上,文字在下摘投,水平居中顯示煮寡,則按下面設(shè)置即可:
button.titleEdgeInsets = UIEdgeInsetsMake(0, -button.imageView.frame.size.width, -button.imageView.frame.size.height, 0);
// button.imageEdgeInsets = UIEdgeInsetsMake(-button.titleLabel.frame.size.height, 0, 0, -button.titleLabel.frame.size.width);
// 由于iOS8中titleLabel的size為0,用上面這樣設(shè)置有問題犀呼,修改一下即可
button.imageEdgeInsets = UIEdgeInsetsMake(-button.titleLabel.intrinsicContentSize.height, 0, 0, -button.titleLabel.intrinsicContentSize.width);
如果覺得圖片和文字離的太近了幸撕,稍微分開一點(diǎn):
CGFloat offset = 40.0f;button.titleEdgeInsets = UIEdgeInsetsMake(0, -button.imageView.frame.size.width, -button.imageView.frame.size.height-offset/2, 0);
// button.imageEdgeInsets = UIEdgeInsetsMake(-button.titleLabel.frame.size.height-offset/2, 0, 0, -button.titleLabel.frame.size.width);
// 由于iOS8中titleLabel的size為0,用上面這樣設(shè)置有問題外臂,修改一下即可
button.imageEdgeInsets = UIEdgeInsetsMake(-button.titleLabel.intrinsicContentSize.height-offset/2, 0, 0, -button.titleLabel.intrinsicContentSize.width);
文字左對(duì)齊坐儿,圖片右對(duì)齊
button.titleEdgeInsets = UIEdgeInsetsMake(0, -button.imageView.frame.size.width - button.frame.size.width + button.titleLabel.intrinsicContentSize.width, 0, 0);
button.imageEdgeInsets = UIEdgeInsetsMake(0, 0, 0, -button.titleLabel.frame.size.width - button.frame.size.width + button.imageView.frame.size.width);
Note:今天發(fā)現(xiàn)個(gè)bug,以上方法在iOS8及以下版本宋光,如果button沒有設(shè)置frame貌矿,而是添加的約束(xib 或 Masonry),會(huì)導(dǎo)致獲取不到 frame.size.width 而造成布局異常罪佳。所以站叼,若用以上方法設(shè)置button,目前建議使用 frame 布局菇民,約束待后續(xù)優(yōu)化。