? 在開發(fā)過程中我們經(jīng)常遇到UIBUtton圖片和文字的位置關(guān)系問題,有四種情況:
? 1??image在上,label在下
?2?image在左,label在右?
?3?image在下,label在上
?4?image在右,label在左
下面我對UIBUtton的Category做了簡單的封裝,簡化代碼:
//?定義一個枚舉(包含了四種類型的button)
typedef?NS_ENUM(NSUInteger, MKButtonEdgeInsetsStyle) {
MKButtonEdgeInsetsStyleTop,?// image在上,label在下
MKButtonEdgeInsetsStyleLeft,?// image在左,label在右
MKButtonEdgeInsetsStyleBottom,?// image在下,label在上
MKButtonEdgeInsetsStyleRight?// image在右,label在左
};
@interface?UIButton (ExteralButton)
/**
*?設(shè)置button的titleLabel和imageView的布局樣式,及間距
?*
*?@param?style titleLabel和imageView的布局樣式
*?@param?space titleLabel和imageView的間距
?*/
- (void)layoutButtonWithEdgeInsetsStyle:(MKButtonEdgeInsetsStyle)style
? ? ? ? ? ? ? ? ? ? ? ? imageTitleSpace:(CGFloat)space;
@end
.m文件
#import?"UIButton+ExteralButton.h"
@implementation?UIButton (ExteralButton)
- (void)layoutButtonWithEdgeInsetsStyle:(MKButtonEdgeInsetsStyle)style
? ? ? ? ? ? ? ? ? ? ? ? imageTitleSpace:(CGFloat)space{
?/**
*?知識點:titleEdgeInsets是title相對于其上下左右的inset,跟tableView的contentInset是類似的,
*?如果只有title,那它上下左右都是相對于button的,image也是一樣;
*?如果同時有image和label,那這時候image的上左下是相對于button,右邊是相對于label的;title的上右下是相對于button,左邊是相對于image的。
?它們只是image和button相較于原來位置的偏移量,那什么是原來的位置呢?就是沒有設(shè)置edgeInset時候的位置了。
?如果要image在右邊,label在左邊,那image的左邊相對于button的左邊右移了labelWidth的距離,image的右邊相對于label的左邊右移了labelWidth的距離
?所以,self.oneButton.imageEdgeInsets = UIEdgeInsetsMake(0, labelWidth, 0, -labelWidth);為什么是負值呢?因為這是contentInset,是偏移量,不是距離
?同樣的,label的右邊相對于button的右邊左移了imageWith的距離,label的左邊相對于image的右邊左移了imageWith的距離
?所以self.oneButton.titleEdgeInsets = UIEdgeInsetsMake(0, -imageWith, 0, imageWith);
?? ? */
?// 1.?得到imageView和titleLabel的寬、高
?CGFloat?imageWith =?self.imageView.frame.size.width;
?CGFloat?imageHeight =?self.imageView.frame.size.height;
?CGFloat?labelWidth = 0.0;
?CGFloat?labelHeight = 0.0;
?//系統(tǒng)最低版本8.0
labelWidth =?self.titleLabel.intrinsicContentSize.width;
labelHeight =?self.titleLabel.intrinsicContentSize.height;
?// 2.?聲明全局的imageEdgeInsets和labelEdgeInsets
?UIEdgeInsets?imageEdgeInsets =?UIEdgeInsetsZero;
?UIEdgeInsets?labelEdgeInsets =?UIEdgeInsetsZero;
?// 3.?根據(jù)style和space得到imageEdgeInsets和labelEdgeInsets的值
?/**
?? ? MKButtonEdgeInsetsStyleTop, // image在上,label在下
?? ? MKButtonEdgeInsetsStyleLeft, // image在左,label在右
?? ? MKButtonEdgeInsetsStyleBottom, // image在下,label在上
?? ? MKButtonEdgeInsetsStyleRight // image在右,label在左
?? ? */
?switch?(style) {
?case?MKButtonEdgeInsetsStyleTop:
? ? ? ? {
imageEdgeInsets =?UIEdgeInsetsMake(-labelHeight-space/2.0, 0, 0, -labelWidth);
labelEdgeInsets =?UIEdgeInsetsMake(0, -imageWith, -imageHeight-space/2.0, 0);
? ? ? ? }
?break;
?case?MKButtonEdgeInsetsStyleLeft:
? ? ? ? {
imageEdgeInsets =?UIEdgeInsetsMake(0, -space/2.0, 0, space/2.0);
labelEdgeInsets =?UIEdgeInsetsMake(0, space/2.0, 0, -space/2.0);
? ? ? ? }
?break;
?case?MKButtonEdgeInsetsStyleBottom:
? ? ? ? {
imageEdgeInsets =?UIEdgeInsetsMake(0, 0, -labelHeight-space/2.0, -labelWidth);
labelEdgeInsets =?UIEdgeInsetsMake(-imageHeight-space/2.0, -imageWith, 0, 0);
? ? ? ? }
?break;
?case?MKButtonEdgeInsetsStyleRight:
? ? ? ? {
imageEdgeInsets =?UIEdgeInsetsMake(0, labelWidth+space/2.0, 0, -labelWidth-space/2.0);
labelEdgeInsets =?UIEdgeInsetsMake(0, -imageWith-space/2.0, 0, imageWith+space/2.0);
? ? ? ? }
?break;
?default:
?break;
? ? }
?// 4.?賦值
?self.titleEdgeInsets?= labelEdgeInsets;
?self.imageEdgeInsets?= imageEdgeInsets;
}
@end