UIButton自定義圖片文字位置總結(jié)

UIButton的默認(rèn)顯示樣式是圖片居左爱咬,文字居右尺借,如下圖1:


圖1.png

但是有時(shí)候我們根據(jù)需求需要調(diào)整按鈕中圖片和標(biāo)題的位置,最常見的就是圖片居上精拟,文字居下顯示的按鈕燎斩,如下圖2所示:


圖2.png

實(shí)現(xiàn)這種居中顯示的圖上文下的按鈕方式有很多,比如最簡(jiǎn)單的方法:自定義View蜂绎,上面放一個(gè)UIButton一個(gè)UILabel子控件栅表。

這里我們介紹其他方法來(lái)實(shí)現(xiàn)UIButton圖片和標(biāo)題的位置調(diào)整:

  • 一種是通過(guò)類別(Category)調(diào)整位置;
  • 一種是通過(guò)繼承重寫系統(tǒng)方法調(diào)整位置。

通過(guò)類別(Category)調(diào)整位置

通過(guò)類別的方法修改圖片標(biāo)題的位置主要是用了UIButton的兩個(gè)位置屬性:titleEdgeInsets师枣,imageEdgeInsets怪瓶。通過(guò)修改按鈕中imagetitleedgeInsets來(lái)改變相對(duì)位置。

@property(nonatomic)          UIEdgeInsets titleEdgeInsets;                // default is UIEdgeInsetsZero
@property(nonatomic)          UIEdgeInsets imageEdgeInsets;                // default is UIEdgeInsetsZero

UIEdgeInsets有四個(gè)參數(shù):top, left, bottom, right践美,分別代表上左下右的偏移量洗贰。

top : 為正數(shù)的時(shí)候,是往下偏移,為負(fù)數(shù)的時(shí)候往上偏移;
left : 為正數(shù)的時(shí)候往右偏移,為負(fù)數(shù)的時(shí)候往左偏移;
bottom : 為正數(shù)的時(shí)候往上偏移,為負(fù)數(shù)的時(shí)候往下偏移;
right :為正數(shù)的時(shí)候往左偏移,為負(fù)數(shù)的時(shí)候往右偏移;

修改按鈕中image和title位置的關(guān)鍵就是正確的設(shè)置這兩個(gè)屬性值的參數(shù),網(wǎng)上很多介紹的方法里寫的都是固定參數(shù)陨倡,如果每次使用都要去計(jì)算的話那就太麻煩了敛滋,這里我們通過(guò)獲取image和title的size來(lái)設(shè)定偏移量,實(shí)現(xiàn)方法的通用玫膀。這也是創(chuàng)建一個(gè)UIButton的category的原因矛缨,方便以后的復(fù)用。

下面貼上category的代碼帖旨,其中計(jì)算titleEdgeInsetsimageEdgeInsets的代碼是最核心的地方箕昭,具體的計(jì)算思路可以從代碼里看出來(lái),就不文字介紹了解阅。這里的計(jì)算思路是最關(guān)鍵的地方落竹,只要知道怎么計(jì)算,就可以使用UIButton實(shí)現(xiàn)其他圖文效果货抄,而不止是圖上文下的居中效果述召。

#import <UIKit/UIKit.h>

@interface UIButton (ZXCenterButton)
/**
 圖片居上,文字居下蟹地,圖文居中按鈕

 @param spaceBetween image和label之間的間距,若設(shè)為nil則距離為0
 @param fontSize 標(biāo)題字體大小积暖,若設(shè)為nil則為默認(rèn)字體大小17
 */
-(instancetype)initCenterBtnWithFrame:(CGRect)frame
                         spaceBetween:(NSNumber*)spaceBetween
                           imageNamed:(NSString *)imageName
                                title:(NSString *)title
                             fontSize:(NSNumber*)fontSize;

@end
#import "UIButton+ZXCenterButton.h"

@implementation UIButton (ZXCenterButton)

-(instancetype)initCenterBtnWithFrame:(CGRect)frame spaceBetween:(NSNumber*)spaceBetween imageNamed:(NSString *)imageName title:(NSString *)title fontSize:(NSNumber*)fontSize{

    if (self = [super initWithFrame:frame]) {
        CGFloat font = fontSize == nil ? 17 : [fontSize floatValue];
        [self setImage:[UIImage imageNamed:imageName] forState:UIControlStateNormal];
        [self setTitle:title forState:UIControlStateNormal];
        self.titleLabel.font = [UIFont systemFontOfSize:font];

        //  圖片的寬高
        CGFloat imageW = self.imageView.frame.size.width;
        CGFloat imageH = self.imageView.frame.size.height;
       
        //  計(jì)算標(biāo)題的size
        CGSize titleSize = [self string:title sizeWithFont:[UIFont systemFontOfSize:font]];
        
        // 圖片+標(biāo)題的總寬高
        CGFloat totalW = imageW + titleSize.width;
        CGFloat totalH = imageH + titleSize.height + spaceBetween.floatValue;
        // 設(shè)置按鈕圖片偏移
        [self setImageEdgeInsets:UIEdgeInsetsMake(-(totalH/2 - imageH/2), totalW/2 - imageW/2, (totalH/2 - imageH/2), -(totalW/2 - imageW/2))];
        // 設(shè)置按鈕標(biāo)題偏移
        [self setTitleEdgeInsets:UIEdgeInsetsMake((totalH/2 - titleSize.height/2), -(totalW/2 - titleSize.width/2), -(totalH/2 - titleSize.height/2), totalW/2 - titleSize.width/2)];
    }
    return self;
}

//  根據(jù)文字的長(zhǎng)度、字體  來(lái)計(jì)算size
- (CGSize)string:(NSString *)string sizeWithFont:(UIFont *)font{
    NSMutableDictionary *attrs = [NSMutableDictionary dictionary];
    attrs[NSFontAttributeName] = font;
    CGSize maxSize = CGSizeMake(MAXFLOAT, MAXFLOAT);
    return [string boundingRectWithSize:maxSize options:NSStringDrawingUsesLineFragmentOrigin attributes:attrs context:nil].size;
}

@end

這種方法使用的時(shí)候注意Button的寬度設(shè)置和title的string長(zhǎng)度怪与,如果按鈕寬度太小夺刑,標(biāo)題的string太長(zhǎng),title無(wú)法全部顯示時(shí)分别,label的寬度計(jì)算會(huì)出現(xiàn)偏差造成布局不居中遍愿。所以使用的時(shí)候要確保title能完全顯示


通過(guò)繼承調(diào)整位置

通過(guò)繼承的方法調(diào)整image和label的位置其實(shí)也有兩種實(shí)現(xiàn)方法:

  • 一種是在- (void)layoutSubviews里面重寫self.titleLabel.frameself.imageView.frame的rect值耘斩;
  • 另一種就是本文要介紹的沼填,重寫系統(tǒng)方法改變title和image的布局。

通過(guò)繼承需要重寫的兩個(gè)系統(tǒng)方法是:

 Objective-C
- (CGRect)titleRectForContentRect:(CGRect)contentRect;  
- (CGRect)imageRectForContentRect:(CGRect)contentRect;

具體實(shí)現(xiàn)方法直接見代碼:

- (CGRect)titleRectForContentRect:(CGRect)contentRect
{
    CGRect titleRect = CGRectMake(0, CGRectGetHeight(self.bounds)/3 * 2, CGRectGetWidth(self.bounds),CGRectGetHeight(self.bounds)/3);
    return titleRect;
}

- (CGRect)imageRectForContentRect:(CGRect)contentRect
{
    CGFloat width = CGRectGetWidth(self.bounds);
    //  圖片占按鈕高度的2/3
    CGRect imageRect = CGRectMake(0, 0, width, CGRectGetHeight(self.bounds)/3 * 2);

    return imageRect;
}

使用這種方法的時(shí)候記得按鈕的標(biāo)題需要設(shè)置為居中括授,此方法來(lái)自我朋友的一篇文章坞笙,詳情請(qǐng)移步,謝謝荚虚。


總結(jié)

解決問(wèn)題的方法有各種各樣薛夜,重要的是能解決問(wèn)題,每個(gè)人的偏好都不一樣曲管。本文介紹的兩種方法却邓,第一種通過(guò)類別修改位置需要對(duì)UIEdgeInsets屬性理解透徹而且需要有很好的圖形位置想象能力,否則自己很容易搞暈院水,但是類別的好處是以后直接拿來(lái)用就可以腊徙,不用再創(chuàng)建類復(fù)制粘貼了;第二種計(jì)算就相對(duì)來(lái)說(shuō)比較簡(jiǎn)單了檬某,但是需要?jiǎng)?chuàng)建類來(lái)繼承撬腾,復(fù)制粘貼代碼。大家選擇適合自己的就好恢恼。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末民傻,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌漓踢,老刑警劉巖牵署,帶你破解...
    沈念sama閱讀 219,490評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異喧半,居然都是意外死亡奴迅,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門挺据,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)取具,“玉大人,你說(shuō)我怎么就攤上這事扁耐∠炯欤” “怎么了?”我有些...
    開封第一講書人閱讀 165,830評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵婉称,是天一觀的道長(zhǎng)块仆。 經(jīng)常有香客問(wèn)我,道長(zhǎng)酿矢,這世上最難降的妖魔是什么榨乎? 我笑而不...
    開封第一講書人閱讀 58,957評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮瘫筐,結(jié)果婚禮上蜜暑,老公的妹妹穿的比我還像新娘。我一直安慰自己策肝,他們只是感情好肛捍,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評(píng)論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著之众,像睡著了一般拙毫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上棺禾,一...
    開封第一講書人閱讀 51,754評(píng)論 1 307
  • 那天缀蹄,我揣著相機(jī)與錄音,去河邊找鬼膘婶。 笑死缺前,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的悬襟。 我是一名探鬼主播衅码,決...
    沈念sama閱讀 40,464評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼脊岳!你這毒婦竟也來(lái)了逝段?” 一聲冷哼從身側(cè)響起垛玻,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎奶躯,沒(méi)想到半個(gè)月后帚桩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,847評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡巫糙,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評(píng)論 3 338
  • 正文 我和宋清朗相戀三年朗儒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了颊乘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片参淹。...
    茶點(diǎn)故事閱讀 40,137評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖乏悄,靈堂內(nèi)的尸體忽然破棺而出浙值,到底是詐尸還是另有隱情,我是刑警寧澤檩小,帶...
    沈念sama閱讀 35,819評(píng)論 5 346
  • 正文 年R本政府宣布开呐,位于F島的核電站,受9級(jí)特大地震影響规求,放射性物質(zhì)發(fā)生泄漏筐付。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評(píng)論 3 331
  • 文/蒙蒙 一阻肿、第九天 我趴在偏房一處隱蔽的房頂上張望瓦戚。 院中可真熱鬧,春花似錦丛塌、人聲如沸较解。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)印衔。三九已至,卻和暖如春姥敛,著一層夾襖步出監(jiān)牢的瞬間奸焙,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工彤敛, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留与帆,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,409評(píng)論 3 373
  • 正文 我出身青樓臊泌,卻偏偏與公主長(zhǎng)得像鲤桥,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子渠概,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)茶凳、插件嫂拴、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,107評(píng)論 4 62
  • 關(guān)于UIButton大家都很熟悉,系統(tǒng)默認(rèn)的樣式,是image在左,title在右的,如下圖所示: 但是,很多情況...
    流火緋瞳閱讀 25,567評(píng)論 16 63
  • 據(jù)說(shuō)這個(gè)軟件還蠻好寫的,總要試試看贮喧。 然而他們說(shuō)得markdown又是怎么回事筒狠?是在這個(gè)頁(yè)面里面寫嗎?然而似乎我不...
    三生無(wú)忌閱讀 155評(píng)論 0 0
  • 希望你帶我吃飯 是因?yàn)橄M页缘慕】蹈鼜?qiáng)壯 希望你給我發(fā)消息是因?yàn)橄胛?想知道我的一切 希望你沒(méi)有聯(lián)系我的時(shí)候忽略...
    小清樓閱讀 132評(píng)論 0 0
  • 我的CSDN博客同步發(fā)布:Android OpenGL入門 轉(zhuǎn)載請(qǐng)注明出處:【huachao1001的簡(jiǎn)書:htt...
    huachao1001閱讀 14,108評(píng)論 3 67