嘴爺發(fā)飆,逐字生敲澄暮,圖文詳解UIButton的imageEdgeInsets和titleEdgeInsets設(shè)置


圖片和文字組合的按鈕比較常見名段,起初不會設(shè)置按鈕這個兩個屬性,為了趕進(jìn)度泣懊,直接再按鈕上加了個圖片和label伸辟,顯然是不太合理的。工作之余好好的研究了下馍刮,終于理解了imageEdgeInsetstitleEdgeInsets信夫。首先我們看一下原理,針對content 水平卡啰、垂直居中的情況去分析静稻,代碼設(shè)置如下:

button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentCenter;
button.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;

xib中按鈕的設(shè)置如圖:


效果如下,默認(rèn)是左右排列,圖片在左匈辱,文字在右

我們期許最后要有如下的效果:

首先引入padding這個概念振湾,CSS用到的多,比如下左的聊天氣泡亡脸,其實就是黑色框距離藍(lán)色氣泡的位置押搪,下右的圖片是CSS里的各種定義树酪,這里我們只需要知道padding 往中心偏移的為正,從中心向外都為負(fù)


針對右上的最中心的藍(lán)色矩形來說(針對父容器綠色矩形)

  • padding-top: 20px;
  • padding-left: 20px;
  • padding-bottom: 20px;
  • padding-right: 20px

當(dāng)然大州,給負(fù)值的一側(cè)就會超出父容器
接下來說正事
按鈕中的image续语,如果我們想讓它相對于原來的位置向右移動20,向上移動10厦画,那么這里父容器就是原來image的位置疮茄,新的位置上下左右移動的位置都是相對于父容器,如圖根暑,實線的矩形表示原來按鈕中image的位置力试,虛線的矩形表示,我們移動后的位置

  • top: -10px; 相對于原來top-border是背離中心(紅色圓形)方向即向外擴(kuò)張
  • bottom: 10px; 相對于原來bottom-border是靠近中心(紅色圓形)方向即向內(nèi)收縮
  • left: 20px; 相對于原來left-border是靠近中心(紅色圓形)方向即向內(nèi)收縮
  • right: 20px; 相對于原來right-border是背離中心(紅色圓形)方向即向外擴(kuò)張

以上的top购裙、 left懂版、 bottom、 right就是我們將要設(shè)置的躏率,我們打開一個工程去試驗一下

-(void)viewWillLayoutSubviews{
    [super viewWillLayoutSubviews];
  
    [self.button setImageEdgeInsets:UIEdgeInsetsMake(-10, 20, 10, -20)];
} 

確實是相對于原來的位置移動的躯畴,我們看一下setImageEdgeInsets這個方法的描述

當(dāng)然我的經(jīng)驗是按鈕大小確定以后去設(shè)置,不會有問題薇芝。

以上是原理蓬抄,我們在實際開發(fā)的時候使用一下,我們先看一個簡單圖左文右的

在image和label中插入一個space夯到,紅色虛線為button 的 content(虛線部分嚷缭,image + label),水平垂直都是居中模式耍贾,若中間插入一個space阅爽,還想保持居中,需要imgae左移半個space荐开,label右移半個space付翁,則content還是居中的,根據(jù)上面的分析晃听,image新的位置相對之前的位置left向外擴(kuò)張(space / 2.0)px百侧,right向內(nèi)收縮(space / 2.0)px,上下沒有動能扒,則

image

  • left: -10px;
  • right: 10px;
  • top: 0px;
  • bottom: 0px;

同理label

  • left: 10px;
  • right: -10px;
  • top: 0px;
  • bottom: 0px;

再看一個上下排列的

分析一下佣渴,如果還要保持content(虛線部分,image + label)居中初斑,對于上下來說辛润,image是向下移動半個label的高度 + 半個space的高度,label向上移動半個image高度 + 半個space的高度见秤;對于左右來說频蛔,如下圖灵迫,image右移動了半個content寬度減去半個image寬度 即 (imageWidth + labelWidth) / 2.0 - imageWidth / 2.0如下圖

這樣我們拿到button中的image和label的寬高即可,這里注意下 imageView晦溪、label 寬高的獲取方式

       //    獲取按鈕圖片的寬高
    CGSize imgSize = self.imageView.intrinsicContentSize;
    CGFloat imageWidth = imgSize.width;
    CGFloat imageHeight = imgSize.height;
    
    //    獲取文字的寬高
    CGSize labelSize = self.titleLabel.intrinsicContentSize;
    CGFloat labelWidth = labelSize.width;
    CGFloat labelHeight = labelSize.height;

那么我們封裝一個類,方便使用挣跋,這里我擴(kuò)展了一個button (PlaceContent)


#import "UIButton+PlaceContent.h"

@implementation UIButton (PlaceContent)

-(void)placeImageTitlePosition:(ZYButtonImagePosition)position space:(CGFloat)space{

    //    獲取按鈕圖片的寬高
    CGSize imgSize = self.imageView.intrinsicContentSize;
    CGFloat imageWidth = imgSize.width;
    CGFloat imageHeight = imgSize.height;
    
    //    獲取文字的寬高
    CGSize labelSize = self.titleLabel.intrinsicContentSize;
    CGFloat labelWidth = labelSize.width;
    CGFloat labelHeight = labelSize.height;

#if DEBUG
    NSLog(@"按鈕圖片 width: %f  height: %f \n", imageWidth, imageHeight);
    NSLog(@"按鈕文字 width: %f  height: %f \n", labelWidth, labelHeight);
    NSLog(@"按鈕大小 width: %f  height: %f \n", self.frame.size.width, self.frame.size.height);
    
#endif
    
    //按鈕圖片文字的位置 EdgeInsets 都是相對原來的位置變化  類似于CSS 里的padding 往內(nèi)側(cè)方向是正
    CGFloat titleTop, titleLeft, titleBottom, titleRight;
    CGFloat imageTop, imageLeft, imageBottom, imageRight;
    
    switch (position) {
            case ZYButtonImagePositionLeft:
            //    圖片在左三圆、文字在右;
            imageTop = 0;
            imageBottom = 0;
            imageLeft =  -space / 2.0;
            imageRight = space / 2.0;
            
            titleTop = 0;
            titleBottom = 0;
            titleLeft = space / 2;
            titleRight = -space / 2;
            break;
            
            case ZYButtonImagePositionTop://    圖片在上,文字在下
            imageTop = -(labelHeight / 2.0 + space / 2.0);//圖片上移半個label高度和半個space高度  給label使用
            imageBottom = (labelHeight / 2.0 + space / 2.0);
            imageLeft = labelWidth / 2.0;
            imageRight = -labelWidth / 2.0f;
            
            titleLeft = -imageWidth / 2.0;
            titleRight = imageWidth / 2.0;
            titleTop = imageHeight / 2.0 + space / 2.0;//文字下移半個image高度和半個space高度
            titleBottom = -(imageHeight / 2.0 + space / 2.0);
            break;
            
            case ZYButtonImagePositionRight://    圖片在右避咆,文字在左
            imageTop = 0;
            imageBottom = 0;
            imageRight = -(labelWidth + space / 2.0);
            imageLeft = labelWidth + space / 2.0;
            
            titleTop = 0;
            titleLeft = -(imageWidth + space / 2.0);
            titleBottom = 0;
            titleRight = imageWidth + space / 2.0;
            break;
            
            case ZYButtonImagePositionBottom://    圖片在下舟肉,文字在上
            imageLeft = (imageWidth + labelWidth) / 2.0 - imageWidth / 2.0;
            imageRight = -labelWidth / 2.0;
            imageBottom = -(labelHeight / 2.0 + space / 2.0);
            imageTop = labelHeight / 2.0 + space / 2.0;//圖片下移半個label高度和半個space高度  給label使用
            
            titleTop = -(imageHeight / 2.0 + space / 2.0);
            titleBottom = imageHeight / 2.0 + space / 2.0;
            titleLeft = -imageWidth / 2.0;
            titleRight = imageWidth / 2.0;
            break;
        default:
            break;
    }
    
    self.imageEdgeInsets = UIEdgeInsetsMake(imageTop, imageLeft, imageBottom, imageRight);
    self.titleEdgeInsets = UIEdgeInsetsMake(titleTop, titleLeft, titleBottom, titleRight);
    
}

@end

看下最終執(zhí)行結(jié)果


感謝您閱讀完畢,如有疑問查库,歡迎添加QQ:714387953(蝸牛上高速)路媚。
github:https://github.com/yhl714387953/ButtonContentEdgeInsets
如果有錯誤,歡迎指正樊销,一起切磋整慎,共同進(jìn)步
如果喜歡可以Follow、Star围苫、Fork,都是給我最大的鼓勵

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末剂府,一起剝皮案震驚了整個濱河市拧揽,隨后出現(xiàn)的幾起案子淤袜,更是在濱河造成了極大的恐慌蓖墅,老刑警劉巖杆勇,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異杏死,居然都是意外死亡冯丙,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門苦始,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人赚爵,你說我怎么就攤上這事麻掸。” “怎么了枯芬?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵论笔,是天一觀的道長。 經(jīng)常有香客問我千所,道長,這世上最難降的妖魔是什么蒜埋? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任淫痰,我火速辦了婚禮,結(jié)果婚禮上整份,老公的妹妹穿的比我還像新娘待错。我一直安慰自己,他們只是感情好烈评,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布火俄。 她就那樣靜靜地躺著,像睡著了一般耿芹。 火紅的嫁衣襯著肌膚如雪函卒。 梳的紋絲不亂的頭發(fā)上谷扣,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機(jī)與錄音谱仪,去河邊找鬼。 笑死否彩,一個胖子當(dāng)著我的面吹牛疯攒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播列荔,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼敬尺,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了贴浙?” 一聲冷哼從身側(cè)響起砂吞,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎悬而,沒想到半個月后呜舒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年袭蝗,在試婚紗的時候發(fā)現(xiàn)自己被綠了唤殴。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡到腥,死狀恐怖朵逝,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情乡范,我是刑警寧澤配名,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站晋辆,受9級特大地震影響渠脉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜瓶佳,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一芋膘、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧霸饲,春花似錦为朋、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至傻工,卻和暖如春霞溪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背精钮。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工威鹿, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人轨香。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓忽你,卻偏偏與公主長得像,于是被迫代替她去往敵國和親臂容。 傳聞我的和親對象是個殘疾皇子科雳,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344

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