讓人又愛又恨拳喻,欲罷不能的控件——UIButton

一、又愛又恨

UIButton是iOS開發(fā)中十分常用的控件猪腕,使用它有很多優(yōu)勢(shì):

1冗澈、它繼承自UIControl,支持多種事件陋葡,能夠很靈活的根據(jù)不同的事件作出不同的響應(yīng)亚亲;

2、它支持多種狀態(tài),可以設(shè)置不同狀態(tài)的相關(guān)屬性捌归,尤其是對(duì)高亮的支持肛响,能夠讓用戶感覺到按鈕被按到了,極大提升了用戶的體驗(yàn)惜索;

3特笋、它可以同時(shí)支持文本和圖片。

但是巾兆,它對(duì)圖片和文本排列樣式的支持不太友好雹有。

它默認(rèn)的樣式是image在左,title在右臼寄, 中間沒有間距霸奕,如果使用自動(dòng)布局,它返回的固有大小剛好包裹內(nèi)容吉拳,沒有邊框质帅。

而在實(shí)際開發(fā)中,我們常常需要一個(gè)其他樣式的button留攒, 例如煤惩,image在上,title在下炼邀,中間需要10個(gè)像素的間距魄揉。

UIButton提供了 contentEdgeInsets、titleEdgeInsets拭宁、imageEdgeInsets幾個(gè)屬性洛退,用來(lái)調(diào)整title和image的位置,從而支持其他的樣式杰标。

很多小伙伴的痛處就在于兵怯,找不到contentEdgeInsets、titleEdgeInsets腔剂、imageEdgeInsets對(duì)image和title位置影響的規(guī)律媒区,不知道如何設(shè)置這幾個(gè)屬性來(lái)達(dá)到想要的效果,有時(shí)候可能費(fèi)了九牛二虎之力掸犬,終于調(diào)到了想要的樣式袜漩,卻發(fā)現(xiàn)點(diǎn)擊按鈕靠邊緣的的放無(wú)法響應(yīng)點(diǎn)擊事件。

二湾碎、欲罷不能

對(duì)于上面的需求宙攻,很多小伙伴可能會(huì)放棄UIButton, 自己通過(guò)一個(gè)UIImageView和一個(gè)UILabel加上一個(gè)UITapGestureRecognizer寫一個(gè)Button胜茧,這樣在功能上滿足了需求粘优,但是按下沒有高亮效果仇味,用戶體驗(yàn)差,要實(shí)現(xiàn)對(duì)多種狀態(tài)的支持雹顺,也是一件相當(dāng)麻煩的事情丹墨。對(duì)于我這種特別懶的人,果斷拋棄這樣的想法嬉愧。

三贩挣、愛上UIButton,不再嫌棄

UIButton默認(rèn)的樣式是這樣的:
屏幕快照 2017-12-04 20.11.43.png

綠色的是Button的邊框没酣,橘紅色的是image的邊框王财, 藍(lán)色的是title的邊框。

contentEdgeInsets裕便、titleEdgeInsets绒净、imageEdgeInsets這三個(gè)屬性都是相對(duì)于默認(rèn)位置(即上圖中的位置)而言的,向內(nèi)為正偿衰,向外為負(fù)挂疆。

1、imageEdgeInsets:根據(jù)上面的理論下翎, imageEdgeInsets的top分量是相對(duì)于image頂部的偏移量缤言,向下為正,向上為負(fù)數(shù)视事;left分量是相對(duì)于image左邊的偏移量胆萧,向右為正,向左為負(fù)俐东;bottom是相對(duì)于image底部的偏移量跌穗,向上為正,向下為負(fù)犬性;right是相對(duì)于image右邊的偏移量瞻离,向左為正腾仅,向右為負(fù)乒裆;

2、titleEdgeInsets:與imageEdgeInsets一樣

3推励、contentEdgeInset:與imageEdgeInsets一樣鹤耍, UIButton的intrinsicContentSize會(huì)根據(jù)contentEdgeInset返回。

舉個(gè)栗子:

現(xiàn)在要實(shí)現(xiàn)上面的:image在上验辞, title在下, 中間10個(gè)點(diǎn)的距離

// 圖片在豎直方向的偏移量(總高度 - 圖片的高度)/ 2
CGFloat imageOffsetY = (titleSize.height + space) / 2;
// 圖片在水平方向的偏移量(總寬度 - 圖片的寬度)/ 2
CGFloat imageOffsetX = titleSize.width / 2;
self.imageEdgeInsets = UIEdgeInsetsMake(-imageOffsetY, imageOffsetX, imageOffsetY, -imageOffsetX);
            
CGFloat titleOffsetY = (imageSize.height + space) / 2;
CGFloat titleOffsetX = imageSize.width / 2;
self.titleEdgeInsets = UIEdgeInsetsMake(titleOffsetY, -titleOffsetX, -titleOffsetY, titleOffsetX);

現(xiàn)在效果是這樣的:
屏幕快照 2017-12-04 20.55.22.png

可以看到稿黄, 在樣式上面滿足了要求,但是跌造,button的frame不對(duì)杆怕,image和title超出了button的范圍族购, 這也是上面提到的,點(diǎn)擊邊緣無(wú)法響應(yīng)的原因陵珍。
下面我們調(diào)整contentEdgeInsets:

// contentInsets是設(shè)置的內(nèi)容邊框寝杖,現(xiàn)在都設(shè)為了0
CGFloat contentOffsetY = (titleSize.height + imageSize.height + space - MAX(titleSize.height, imageSize.height))  / 2;
            CGFloat contentOffsetX = (titleSize.width + imageSize.width - MAX(titleSize.width, imageSize.width)) / 2;
            self.contentEdgeInsets = UIEdgeInsetsMake(contentOffsetY + self.contentInsets.top, -contentOffsetX + self.contentInsets.left, contentOffsetY + self.contentInsets.bottom, -contentOffsetX + self.contentInsets.right);

效果如下:
屏幕快照 2017-12-04 21.00.11.png

可以看到,已經(jīng)達(dá)到了要求互纯, 下面再加上邊距:
屏幕快照 2017-12-04 21.01.45.png

好啦瑟幕,就寫到這里了,希望小伙伴們都能愛上UIButton留潦。歡迎一起交流只盹、討論!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末兔院,一起剝皮案震驚了整個(gè)濱河市殖卑,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌坊萝,老刑警劉巖懦鼠,帶你破解...
    沈念sama閱讀 221,430評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異屹堰,居然都是意外死亡肛冶,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門扯键,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)睦袖,“玉大人,你說(shuō)我怎么就攤上這事荣刑∠隗希” “怎么了?”我有些...
    開封第一講書人閱讀 167,834評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵厉亏,是天一觀的道長(zhǎng)董习。 經(jīng)常有香客問(wèn)我,道長(zhǎng)爱只,這世上最難降的妖魔是什么皿淋? 我笑而不...
    開封第一講書人閱讀 59,543評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮恬试,結(jié)果婚禮上窝趣,老公的妹妹穿的比我還像新娘。我一直安慰自己训柴,他們只是感情好哑舒,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,547評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著幻馁,像睡著了一般洗鸵。 火紅的嫁衣襯著肌膚如雪越锈。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,196評(píng)論 1 308
  • 那天膘滨,我揣著相機(jī)與錄音瞪浸,去河邊找鬼。 笑死吏祸,一個(gè)胖子當(dāng)著我的面吹牛对蒲,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播贡翘,決...
    沈念sama閱讀 40,776評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼蹈矮,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了鸣驱?” 一聲冷哼從身側(cè)響起泛鸟,我...
    開封第一講書人閱讀 39,671評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎踊东,沒想到半個(gè)月后北滥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,221評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡闸翅,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,303評(píng)論 3 340
  • 正文 我和宋清朗相戀三年再芋,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片坚冀。...
    茶點(diǎn)故事閱讀 40,444評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡济赎,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出记某,到底是詐尸還是另有隱情司训,我是刑警寧澤,帶...
    沈念sama閱讀 36,134評(píng)論 5 350
  • 正文 年R本政府宣布液南,位于F島的核電站壳猜,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏滑凉。R本人自食惡果不足惜统扳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,810評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望譬涡。 院中可真熱鬧闪幽,春花似錦、人聲如沸涡匀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)陨瘩。三九已至腕够,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間舌劳,已是汗流浹背帚湘。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留甚淡,地道東北人大诸。 一個(gè)月前我還...
    沈念sama閱讀 48,837評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像贯卦,于是被迫代替她去往敵國(guó)和親资柔。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,455評(píng)論 2 359

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