需求:修改按鈕的布局文字在下,圖片在上。
實(shí)現(xiàn)方式:只會(huì)使用添加分類的方式去實(shí)現(xiàn):
以下內(nèi)容僅針對(duì)title是單行的情況,以下內(nèi)容僅針對(duì)title是單行的情況,以下內(nèi)容僅針對(duì)title是單行的情況,多行我也不知道。
注意:默認(rèn)的情況下,文字在右,圖片在左,但是你知道嗎,圖片和文字其實(shí)是均分按鈕布局的。即將按鈕圖片和文字看做是一個(gè)整體的話,它其實(shí)是居中的。
不信看圖:

圖片frame:

文字frame:

核心一:
水平方向:300(按鈕寬度) = 圖片X坐標(biāo)(27)*2 + 176(圖片寬度) + (文字寬度69.5近似取70)70;
水平方向:同理
說(shuō)以,要實(shí)現(xiàn)需求,分兩步走戰(zhàn)略。
a.先將圖片右移,移動(dòng)距離其實(shí)就是文字寬度的一半(WTF?畫圖看看),但設(shè)置EdgeInsets的時(shí)候卻需要設(shè)置整個(gè)寬度。然后上移,上移距離且聽(tīng)后文分解。
b.移動(dòng)文字同理。
核心二:
上移距離:先將圖片文字看成上下排列的整體,移動(dòng)后居中顯示。其實(shí)就是在圖片原有高度上的基礎(chǔ)上增加了文字的高度,所以圖片上移距離為文字高度的一半,文字下移圖片高度的一半。此時(shí)圖片文字無(wú)間距。(需要間距的話自己加上間距吧)。
添加Button分類,作用是在分類里獲取文字和圖片的size。
方式一、
self.titleLabel.frame,self.imageView.frame獲取,獲取之前調(diào)用[self layoutIfNeeded]。否則可能獲取不到。
方式二、
圖片:
UIImage *btnImage = [self imageForState:UIControlStateNormal];
CGSize imageSize = btnImage.size;
文字:
NSString *title = [self titleForState:UIControlStateNormal];
CGFloat fontSize = self.titleLabel.font.pointSize;
CGSize titleSize = [title boundingRectWithSize:CGSizeMake(0, 0) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:fontSize]} context:nil].size;
設(shè)置EdgeInsets:
self.titleEdgeInsets = UIEdgeInsetsMake(imageSize.height + 8, -(imageSize.width), 0, 0);
self.imageEdgeInsets = UIEdgeInsetsMake(0,0,titleSize.height + 8,-(titleSize.width));
注:文字完全顯示時(shí)兩種方式無(wú)差異,但是但文字顯示不全時(shí)(單行),標(biāo)題會(huì)以 "你個(gè)...."顯示,這個(gè)時(shí)候方式一就不能正確獲取到文字的寬度。