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

圖片frame:

文字frame:

核心一:
水平方向:300(按鈕寬度) = 圖片X坐標(27)*2 + 176(圖片寬度) + (文字寬度69.5近似取70)70;
水平方向:同理
說以,要實現(xiàn)需求,分兩步走戰(zhàn)略。
a.先將圖片右移,移動距離其實就是文字寬度的一半(WTF?畫圖看看),但設置EdgeInsets的時候卻需要設置整個寬度。然后上移,上移距離且聽后文分解。
b.移動文字同理。
核心二:
上移距離:先將圖片文字看成上下排列的整體,移動后居中顯示。其實就是在圖片原有高度上的基礎上增加了文字的高度,所以圖片上移距離為文字高度的一半,文字下移圖片高度的一半。此時圖片文字無間距。(需要間距的話自己加上間距吧)。
添加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;
設置EdgeInsets:
self.titleEdgeInsets = UIEdgeInsetsMake(imageSize.height + 8, -(imageSize.width), 0, 0);
self.imageEdgeInsets = UIEdgeInsetsMake(0,0,titleSize.height + 8,-(titleSize.width));
注:文字完全顯示時兩種方式無差異,但是但文字顯示不全時(單行),標題會以 "你個...."顯示,這個時候方式一就不能正確獲取到文字的寬度。