UIButton 圖片和文字的相對位置

? 在開發(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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容