iOS UIButton文字和圖片間距隨意調(diào)整

前記

在開(kāi)發(fā)中,我們經(jīng)常會(huì)遇到這么一種情況辣吃,就是一個(gè)按鈕上面有圖片也有文字动遭,但是往往設(shè)計(jì)并不是我們想要的那種,比如可能圖片在上神得,文字在下厘惦,或者圖片在左,文字在右哩簿,關(guān)鍵是還有一定的距離宵蕉,并不是系統(tǒng)默認(rèn)UIButton中,圖片和文字的間距节榜。當(dāng)然羡玛,這調(diào)整圖片和文字的距離的小事,是難不倒大家的宗苍,因?yàn)榇蠹叶贾兰诟澹?code>UIButton中薄榛,有這么兩個(gè)屬性titleEdgeInsetsimageEdgeInsets

關(guān)于屬性

關(guān)于titleEdgeInsetsimageEdgeInsets這兩個(gè)屬性,簡(jiǎn)單介紹下:
titleEdgeInsetstitle相對(duì)于其上下左右的inset让歼,跟tableViewcontentInset是類似的敞恋,如果只有title,那它上下左右都是相對(duì)于button的谋右,imageEdgeInsets也是一樣
如果同時(shí)有imagetitle硬猫,那這時(shí)候image的上左下是相對(duì)于button,右邊是相對(duì)于title的改执;title的上右下是相對(duì)于button啸蜜,左邊是相對(duì)于image的,也就是說(shuō)image是默認(rèn)居左的天梧。
通過(guò)以上兩個(gè)屬性,可以很輕松的實(shí)現(xiàn)文字圖片的位置及距離的調(diào)整霞丧,如果每次在用的時(shí)候呢岗,都去重新寫(xiě)一片,難免會(huì)很麻煩蛹尝,鑒于此后豫,之前在謀篇博客中(具體忘了,原博主看到請(qǐng)勿見(jiàn)怪)突那,看到過(guò)用category封裝的挫酿,于是我在項(xiàng)目中,也寫(xiě)了一個(gè)category愕难,其中也列舉了四種不同的枚舉來(lái)表現(xiàn)其不同的場(chǎng)景

枚舉類型

// 定義一個(gè)枚舉(包含了四種類型的button)
typedef NS_ENUM(NSUInteger, GLButtonEdgeInsetsStyle) {
    GLButtonEdgeInsetsStyleTop, // image在上早龟,label在下
    GLButtonEdgeInsetsStyleLeft, // image在左,label在右
    GLButtonEdgeInsetsStyleBottom, // image在下猫缭,label在上
    GLButtonEdgeInsetsStyleRight // image在右葱弟,label在左
};

并且定義了一個(gè)簡(jiǎn)單使用的方法:

/**
 *  設(shè)置button的titleLabel和imageView的布局樣式,及間距
 *
 *  @param style titleLabel和imageView的布局樣式
 *  @param space titleLabel和imageView的間距
 */
- (void)layoutButtonWithEdgeInsetsStyle:(GLButtonEdgeInsetsStyle)style
                        imageTitleSpace:(CGFloat)space;

其中space是指圖片文字之間的間距猜丹,style對(duì)應(yīng)上面的枚舉芝加,可以針對(duì)性的選擇

具體實(shí)現(xiàn)方法

- (void)layoutButtonWithEdgeInsetsStyle:(GLButtonEdgeInsetsStyle)style
                        imageTitleSpace:(CGFloat)space {
    /**
     *  知識(shí)點(diǎn):titleEdgeInsets是title相對(duì)于其上下左右的inset,跟tableView的contentInset是類似的射窒,
     *  如果只有title藏杖,那它上下左右都是相對(duì)于button的,image也是一樣脉顿;
     *  如果同時(shí)有image和label蝌麸,那這時(shí)候image的上左下是相對(duì)于button,右邊是相對(duì)于label的艾疟;title的上右下是相對(duì)于button祥楣,左邊是相對(duì)于image的开财。
     */
    
    // 1. 得到imageView和titleLabel的寬、高
    CGFloat imageWith = self.imageView.image.size.width;
    CGFloat imageHeight = self.imageView.image.size.height;
    
    CGFloat labelWidth = 0.0;
    CGFloat labelHeight = 0.0;
    if ([UIDevice currentDevice].systemVersion.floatValue >= 8.0) {
    // 由于iOS8中titleLabel的size為0误褪,用下面的這種設(shè)置
        labelWidth = self.titleLabel.intrinsicContentSize.width;
        labelHeight = self.titleLabel.intrinsicContentSize.height;
    } else {
        labelWidth = self.titleLabel.frame.size.width;
        labelHeight = self.titleLabel.frame.size.height;
    }
    
    // 2. 聲明全局的imageEdgeInsets和labelEdgeInsets
    UIEdgeInsets imageEdgeInsets = UIEdgeInsetsZero;
    UIEdgeInsets labelEdgeInsets = UIEdgeInsetsZero;
    
    // 3. 根據(jù)style和space得到imageEdgeInsets和labelEdgeInsets的值

    switch (style) {
        case GLButtonEdgeInsetsStyleTop:
        {            
            imageEdgeInsets = UIEdgeInsetsMake(-labelHeight-space/2.0, 0, 0, -labelWidth);
            labelEdgeInsets = UIEdgeInsetsMake(0, -imageWith, -imageHeight-space/2.0, 0);
        }
            break;
        case GLButtonEdgeInsetsStyleLeft:
        {
            imageEdgeInsets = UIEdgeInsetsMake(0, -space/2.0, 0, space/2.0);
            labelEdgeInsets = UIEdgeInsetsMake(0, space/2.0, 0, -space/2.0);
        }
            break;
        case GLButtonEdgeInsetsStyleBottom:
        {
            imageEdgeInsets = UIEdgeInsetsMake(0, 0, -labelHeight-space/2.0, -labelWidth);
            labelEdgeInsets = UIEdgeInsetsMake(-imageHeight-space/2.0, -imageWith, 0, 0);
        }
            break;
        case GLButtonEdgeInsetsStyleRight:
        {
            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;
}

實(shí)現(xiàn)效果

button

其實(shí)思路很簡(jiǎn)單责鳍,這里只是簡(jiǎn)單封裝了下,還是留一個(gè)demo地址兽间,方便大家

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末历葛,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子嘀略,更是在濱河造成了極大的恐慌恤溶,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件帜羊,死亡現(xiàn)場(chǎng)離奇詭異咒程,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)讼育,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)帐姻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人奶段,你說(shuō)我怎么就攤上這事饥瓷。” “怎么了痹籍?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵呢铆,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我蹲缠,道長(zhǎng)棺克,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任线定,我火速辦了婚禮逆航,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘渔肩。我一直安慰自己因俐,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布周偎。 她就那樣靜靜地躺著抹剩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蓉坎。 梳的紋絲不亂的頭發(fā)上澳眷,一...
    開(kāi)封第一講書(shū)人閱讀 51,688評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音蛉艾,去河邊找鬼钳踊。 笑死衷敌,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的拓瞪。 我是一名探鬼主播缴罗,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼祭埂!你這毒婦竟也來(lái)了面氓?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蛆橡,失蹤者是張志新(化名)和其女友劉穎舌界,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體泰演,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡呻拌,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了睦焕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片藐握。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖复亏,靈堂內(nèi)的尸體忽然破棺而出趾娃,到底是詐尸還是另有隱情缭嫡,我是刑警寧澤缔御,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站妇蛀,受9級(jí)特大地震影響耕突,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜评架,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一眷茁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧纵诞,春花似錦上祈、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至嗡呼,卻和暖如春纸俭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背南窗。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工揍很, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留郎楼,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓窒悔,卻偏偏與公主長(zhǎng)得像呜袁,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蛉迹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

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