UIButton實(shí)現(xiàn)圖片和文字自定義排列

我們在開發(fā)的時候經(jīng)常遇到一個需求就是需要創(chuàng)建一個按鈕同時可以放圖片和文字稻薇,實(shí)現(xiàn)這個需求可以有很多種方法:

UIButtonTop.png
  • 比如創(chuàng)建一個UIView然后添加UIImageViewUILable,最后給他添加一個單擊的手勢胶征。
  • 再比如自定義一個UIButton塞椎,在上邊添加UIImageViewUILabel
  • 當(dāng)然睛低,我們也可以用系統(tǒng)的UIButton直接設(shè)置圖片和文字案狠,但是使用系統(tǒng)的UIButton時如何擺放圖片和文字的位置就需要好好研究一下。

所以這篇文章就寫一下如何來擺放系統(tǒng)UIButton中的圖片和文字钱雷。

準(zhǔn)備

UIButton中有兩個方法用來設(shè)置圖片和按鈕的邊界約束:

@property(nonatomic)          UIEdgeInsets titleEdgeInsets;                
@property(nonatomic)          UIEdgeInsets imageEdgeInsets;                

通過設(shè)置這兩個參數(shù)我們就能設(shè)置圖片和按鈕的位置骂铁,從而實(shí)現(xiàn) 圖片在上文字在下、圖片在下文字在上罩抗、圖片在左文字在右和圖片在右文字在左的樣式拉庵。

默認(rèn)情況下圖片是在左邊,文字在右邊的套蒂。

originalStatus.png

接下來這段非常重要

圖片的上钞支、下茫蛹、左約束是相對于UIButton的,而右是相對于文字的:

ImageEdge.png

文字的上烁挟、下婴洼、右約束是相對于UIButton的,而左是相對于圖片的:

titleEdge.png

開搞

首先我們先確定幾個參數(shù):

  • 按鈕大行欧颉:這個不用說了窃蹋,如果想要通過這種方法排列圖片和文字就一定要先確定好按鈕的大小。

    CGSize buttonSize = self.frame.size;
    
  • 文字大芯驳尽:UIButton有自己的titleLabel警没,所我們設(shè)置好文字之后直接獲取titleLabel的大小就可以了。

    CGSize titleSize = self.titleLabel.intrinsicContentSize;
    
  • 圖片大姓裢濉:這個和文字一樣杀迹,我們設(shè)置好圖片之后直接獲取imageView的大小就可以了。

    CGSize imageSize = self.imageView.frame.size;
    
  • 圖片和文字之間的空隙:我們肯定不是希望圖片和文字緊貼在一起吧押搪,所以設(shè)置一個圖片和文字之間的空隙大小是有必要的树酪。

    CGFloat buttonSpace = 10.0;
    

圖片在上,文字在下

設(shè)置垂直方向的排列時我們還需要獲取一個參數(shù)大州,就是按鈕和文字续语、圖片垂直空間上上下兩邊的空隙。

ZZRBUTTONTYPE_IMAGE_TOP.png

這個空隙的大小就是按鈕的高度減去圖片和文字以及中間空隙的高度除2獲得的厦画。

CGFloat verticalSpace = (buttonSize.height - titleSize.height - imageSize.height - buttonSpace)/2.0;

接下來就是設(shè)置圖片和文字的邊界了

圖片邊界:
  • 上:上邊界不用說了疮茄,相對于按鈕,所以直接設(shè)置成垂直空隙大小就可以了根暑。

  • 左:左側(cè)因?yàn)橐彩窍鄬τ诎粹o力试,為了讓圖片居中,就直接設(shè)置成(按鈕寬度-圖片寬度)/2就可以了排嫌。

  • 下:下邊界也是相對于按鈕畸裳,因?yàn)閳D片在上,所以設(shè)置成垂直(空隙大小+文字高度+空隙)就可以了淳地。

  • 右:右側(cè)是比較重要的約束怖糊,因?yàn)橛覀?cè)是相對與文字的,我們可以理解成如果沒有文字颇象,右側(cè)的空間應(yīng)該和左側(cè)一樣(按鈕寬度-圖片寬度)/2蓬抄,但是因?yàn)槎嗔宋淖郑@樣設(shè)置就會導(dǎo)致位置出現(xiàn)偏差夯到,所以要減去文字的寬度嚷缭。

這樣一來,圖片的邊界就設(shè)置好了。

文字邊界:
  • 上:上邊界同樣是相對按鈕的阅爽,因?yàn)槲淖衷谙侣沸遥栽O(shè)置成(空隙大小+圖片高度+空隙)就可以了。

  • 左:理解了前邊的圖片付翁,文字也是一樣简肴,所以左側(cè)的空間約束應(yīng)為(按鈕寬度-文字寬度)/2再減去圖片的寬度。

  • 下:下沒什么好說的了百侧,相對于按鈕砰识,所以為垂直方向的空隙。

  • 右:右側(cè)也是相對于按鈕佣渴,所以直接設(shè)置成(按鈕寬度-文字寬度)/2就可以了辫狼。

這樣設(shè)置了之后,文字和圖片的位置就設(shè)置好了辛润。

            //上下空余的間隙
            CGFloat verticalSpace = (buttonSize.height - titleSize.height - imageSize.height - buttonSpace)/2.0;
            
            [self setImageEdgeInsets:UIEdgeInsetsMake(verticalSpace,
                                                      (buttonSize.width-imageSize.width)/2.0,
                                                      verticalSpace + titleSize.height + buttonSpace,
                                                      (buttonSize.width-imageSize.width)/2.0-titleSize.width)];
            
            [self setTitleEdgeInsets:UIEdgeInsetsMake(verticalSpace + imageSize.height + buttonSpace,
                                                      (buttonSize.width - titleSize.width)/2.0 - imageSize.width,
                                                      verticalSpace,
                                                      (buttonSize.width - titleSize.width)/2.0)];
UIButtonTop.png
UIButtonTop_showLine.png

圖片在左膨处,文字在右

這個情況是系統(tǒng)默認(rèn)的情況,所以我們基本不需要做處理砂竖,只需要把圖片右側(cè)相對于文字的空隙和文字左側(cè)相對于圖片的空隙都設(shè)置為我們設(shè)置的空隙就可以了真椿。

            [self setImageEdgeInsets:UIEdgeInsetsMake(0,
                                                      0,
                                                      0,
                                                      buttonSpace)];
            
            [self setTitleEdgeInsets:UIEdgeInsetsMake(0,
                                                      buttonSpace,
                                                      0,
                                                      0)];
UIButtonLeft.png
UIButtonLeft_showLine.png

圖片在右,文字在左

這個情況和上邊的情況類似乎澄,只不過文字和圖片調(diào)換了位置突硝,所以我們把他們互相約束的大小改成負(fù)的(圖片寬度+文字寬度+空隙)就可以了。

            [self setImageEdgeInsets:UIEdgeInsetsMake(0,
                                                      0,
                                                      0,
                                                      -(imageSize.width + titleSize.width + buttonSpace))];
            
            [self setTitleEdgeInsets:UIEdgeInsetsMake(0,
                                                      -(imageSize.width + titleSize.width + buttonSpace),
                                                      0,
                                                      0)];
UIButtonRight.png
UIButtonRight_showLine.png

圖片在下置济,文字在上

這個情況和第一種情況(圖片在上解恰,文字在下)類似,只不過是文字和圖片在垂直方向上調(diào)換了一下位置舟肉,左右的約束都沒有改變,所以也就不詳細(xì)說了查库,理解了第一種情況應(yīng)該就很好理解這中情況路媚。

            CGFloat verticalSpace = (buttonSize.height - titleSize.height - imageSize.height - buttonSpace)/2.0;
            
            [self setImageEdgeInsets:UIEdgeInsetsMake(verticalSpace + titleSize.height + buttonSpace,
                                                      (buttonSize.width-imageSize.width)/2.0,
                                                      verticalSpace,
                                                      (buttonSize.width-imageSize.width)/2.0-titleSize.width)];

            [self setTitleEdgeInsets:UIEdgeInsetsMake(verticalSpace,
                                                      (buttonSize.width - titleSize.width)/2.0 - imageSize.width,
                                                      verticalSpace + imageSize.height + buttonSpace,
                                                      (buttonSize.width - titleSize.width)/2.0)];
UIButtonBottom.png
UIButtonBottom_showLine.png

結(jié)束

其實(shí)這個邊界的東西很好理解,只要想通了一個樊销,其他方向的就很好控制了整慎。
以上的內(nèi)容都是我自己研究出來的結(jié)果,如果有哪些地方不對围苫,還希望有大神能夠批評指正裤园。
那今天就這樣了~

啊對了!Demo地址在這里剂府。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末拧揽,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌淤袜,老刑警劉巖痒谴,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異铡羡,居然都是意外死亡积蔚,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門烦周,熙熙樓的掌柜王于貴愁眉苦臉地迎上來尽爆,“玉大人,你說我怎么就攤上這事读慎∈” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵贪壳,是天一觀的道長饱亿。 經(jīng)常有香客問我,道長闰靴,這世上最難降的妖魔是什么彪笼? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮蚂且,結(jié)果婚禮上配猫,老公的妹妹穿的比我還像新娘。我一直安慰自己杏死,他們只是感情好泵肄,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著淑翼,像睡著了一般腐巢。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上玄括,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天冯丙,我揣著相機(jī)與錄音,去河邊找鬼遭京。 笑死胃惜,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的哪雕。 我是一名探鬼主播船殉,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼斯嚎!你這毒婦竟也來了利虫?” 一聲冷哼從身側(cè)響起挨厚,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎列吼,沒想到半個月后幽崩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡寞钥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年慌申,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片理郑。...
    茶點(diǎn)故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡蹄溉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出您炉,到底是詐尸還是另有隱情柒爵,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布赚爵,位于F島的核電站棉胀,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏冀膝。R本人自食惡果不足惜唁奢,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望窝剖。 院中可真熱鬧麻掸,春花似錦、人聲如沸赐纱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽疙描。三九已至诚隙,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間起胰,已是汗流浹背久又。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留待错,地道東北人籽孙。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓烈评,卻偏偏與公主長得像火俄,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子讲冠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評論 2 345

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