理解UIButton的各種EdgeInsets

這篇文章整理了一下UIButton的各種EdgeInsets都咋用奏纪,有啥效果。留著自己以后對此迷糊時再看一看洋侨,也希望能對你有所幫助喔??矾瑰。

達(dá)成共識

如果沒有給UIButton的寬和高一個固定值,那么UIButon
的大小將自動調(diào)整為正好放下 titleimage。這個蘋果官方文檔有提到碉碉,而且在Storyboard中一試便知柴钻。此外,默認(rèn)情況下圖片在左垢粮,文字在右贴届。
沒有給固定寬和高,給UIButton設(shè)置了一個imagetitle蜡吧,運(yùn)行的結(jié)果如下:

ButtonEdgeInsets.jpg

UIControlContent Vertical/Horizontal Alignment

在開始說EdgeInsets之前毫蚓,先說說UIControlContentVerticalAlignmentUIControlContentHorizontalAlignment產(chǎn)生的效果,因為這兩個屬性的設(shè)置也會對UIButton的效果有一定影響斩跌,而且跟后面EdgeInsets的計算也有關(guān)系绍些。

UIControlContentVerticalAlignment控制的是UIButtonimagetitle在豎直方向的對齊方式,其值有top耀鸦、bottom柬批、 centerfill袖订。當(dāng)指定為fill時氮帐,圖片會在豎直方向被拉伸填滿UIButton的高度。

為了效果明顯洛姑,我給上面的那個按鈕設(shè)置了一個較大的寬高上沐,當(dāng)取各種值時,效果如下:

ButtonEdgeInsets-Vertical.jpg

的對齊方式楞艾。其值有left参咙、rightcenter硫眯、fill蕴侧。當(dāng)指定為fill時,圖片并沒有在水平方向?qū)?code>UIButton充滿两入,而是在右側(cè)留出了一定距離净宵,這個距離應(yīng)該是title的寬度,但是title實際上也沒有乖乖的跑到那段空隙去裹纳,而是和image重疊了╮(╯▽╰)╭

當(dāng)取各種值時择葡,效果如下:

ButtonEdgeInsets-Horizontal.jpg

UIControlContentHorizontalAlignment控制的則是水平方向

UIEdgeInsets

UIButton共有3個與UIEdgeInsets相關(guān)的屬性:

imageEdgeInsets調(diào)整image的上下左右邊緣離開原來位置的距離,該調(diào)整并不會改變UIButton原來的大小剃氧,image為了適應(yīng)調(diào)整敏储,可能會變形或者跑出UIButton的外面。

titleEdgeInsets調(diào)整title的上下左右邊緣離開原來位置的距離朋鞍,該調(diào)整并不會改變UIButton原來的大小已添,title為了適應(yīng)調(diào)整迫横,文字可能顯示不全或者跑出UIButton的外面。

contentEdgeInsets調(diào)整UIButton本身的上下左右邊緣離開原來位置的距離酝碳,該調(diào)整會改變UIButton的大小。

這個3個屬性的默認(rèn)值都是.zero恨狈。

UIEdgeInsetstop疏哗、leftbottom禾怠、right構(gòu)成返奉,對于imageEdgeInsetstitleEdgeInsets來說:

top為正值時,控件會相對原來所在的位置下移相應(yīng)值吗氏,控件的頂部邊緣會在原來位置的下方相應(yīng)值芽偏。top為負(fù)值時,控件會相對原來的位置上移相應(yīng)值弦讽,控件的頂部邊緣會在原來位置的上方相應(yīng)值污尉。

left為正值時,控件會相對原來所在的位置右移相應(yīng)值往产,控件的左側(cè)邊緣會在原來位置的右方相應(yīng)值被碗。left為負(fù)值時,控件會相對原來的位置左移相應(yīng)值仿村,控件的左側(cè)邊緣會在原來位置的左方相應(yīng)值锐朴。

bottom為正值時,控件會相對原來所在的位置上移相應(yīng)值蔼囊,控件的底部邊緣會在原來位置的上方相應(yīng)值焚志。bottom為負(fù)值時,控件會相對原來的位置下移相應(yīng)值畏鼓,控件的底部邊緣會在原來位置的下方相應(yīng)值酱酬。

right為正值時,控件會相對原來所在的位置左移相應(yīng)值滴肿,控件的右側(cè)邊緣會在原來位置的左方相應(yīng)值岳悟。right為負(fù)值時,控件會相對原來位置右移相應(yīng)值泼差,控件的右側(cè)邊緣會在原來位置的右方相應(yīng)值贵少。

對于contentEdgeInsets來說,當(dāng)top堆缘、left滔灶、bottomright為正值時吼肥,會使UIButton向四周擴(kuò)展變大录平。為負(fù)值時麻车,會使UIButton向內(nèi)收縮變小。哈哈斗这,這樣好記一些??

現(xiàn)在把UIButton的固定大小去掉动猬,讓它自己自適應(yīng)。先來一個水平方向調(diào)整的:

yellowButton.contentHorizontalAlignment = .left
yellowButton.contentVerticalAlignment = .center
yellowButton.imageEdgeInsets = UIEdgeInsetsMake(0, 20, 0, 0)
yellowButton.titleEdgeInsets = UIEdgeInsetsMake(0, 20, 0, 0)

ButtonEdgeInsets-Left.jpg

第一張圖只設(shè)置了imageEdgeInsets表箭,沒有設(shè)置titleEdgeInsets赁咙,第三張兩者都設(shè)置了∶庾辏可以看到彼水,imageEdgeInsetstitleEdgeInsets并不會互相影響,第一張圖中imagetitle重合了极舔,并沒有把title往右擠了相應(yīng)距離凤覆。第二張和第四張看到,imagetitle本身被壓縮了拆魏。

還有一點(diǎn)值得注意的是盯桦,如果原來UIButton的大小能容納下調(diào)整后的imagetitle,它們將不會被壓縮稽揭。像第一張那樣俺附,image左移后還是放得下的,所以沒有被壓縮溪掀,title卻放不下了事镣,所以被壓縮了。為什么說是原來的大小呢揪胃,因為調(diào)整contentEdgeInsets也會使UIButton變大璃哟,但是imagetitle卻不會因此而不被壓縮。再來一個豎直方向調(diào)整的:

yellowButton.contentHorizontalAlignment = .center
yellowButton.contentVerticalAlignment = .top
yellowButton.imageEdgeInsets = UIEdgeInsetsMake(20, 0, 0, 0)
yellowButton.titleEdgeInsets = UIEdgeInsetsMake(20, 0, 0, 0)

ButtonEdgeInsets-Top.jpg

第一張圖仍然是只調(diào)整了imageEdgeInsets的效果喊递。

從上面的結(jié)果可以看到調(diào)整imageEdgeInsetstitleEdgeInsets并不會改變UIButton的大小随闪,而導(dǎo)致有時圖片被壓縮,或者文字顯示不下骚勘。這時就要接著用UIButton的另一個屬性contentEdgeInsets來調(diào)整了铐伴。

yellowButton.contentHorizontalAlignment = .left
yellowButton.contentVerticalAlignment = .center yellow
Button.imageEdgeInsets = UIEdgeInsetsMake(0, 20, 0, 0)
yellowButton.titleEdgeInsets = UIEdgeInsetsMake(0, 20, 0, 0)yellowButton.contentEdgeInsets = UIEdgeInsetsMake(0, 0, 0, 20)

ButtonEdgeInsets-Content.jpg

好吧,結(jié)果并不如我們想象的一樣俏讹,UIButton是變大了当宴,但是image
title并沒有自己調(diào)整,還是一個壓縮的狀態(tài)泽疆。驗證了上面值得注意的那一點(diǎn)~ 這時候要再調(diào)整一下它們的right值了户矢,將其設(shè)置為-20
,如愿得到了下面的結(jié)果殉疼。

ButtonEdgeInsets-Content-Right.jpg

需要注意 當(dāng)設(shè)置contentHorizontalAlignment.left時梯浪,再設(shè)置imageEdgeInsetstitleEdgeInsets.right為負(fù)值時捌年,如果imagetitle原來是壓縮狀態(tài),會對其調(diào)整挂洛。如果原來是正常狀態(tài)礼预,則不會產(chǎn)任何影響。也就是說虏劲,imageEdgeInsetstitleEdgeInsets的設(shè)置并不會讓imagetitle被拉伸逆瑞!其他方向亦如此~所以,為了保證imagetitle始終不被壓縮伙单,.left設(shè)置了多少正值,.right就設(shè)置多少負(fù)值哈肖。上下方向也一樣吻育。

實戰(zhàn)

上面做了這么多鋪墊,現(xiàn)在通過設(shè)置UIButton的3個EdgeInsets屬性來實現(xiàn)一些我們想要的效果吧??

在做水平方向的調(diào)整時淤井,最好將contentHorizontalAlignment設(shè)置為.left布疼,這樣改動就從左開始。在做豎直方向的調(diào)整時币狠,最好將contentVerticalAlignment設(shè)置為.top游两,這樣改動就從上面開始。對于自己在設(shè)置時漩绵,比較容易在腦子想象每個值設(shè)置完的樣子??

例1:設(shè)置一個四周間隔20贱案,image和title之間間隔20的button。

計算過程如下:

ButtonEdgeInsets-Space.jpg
//向的調(diào)整止吐,設(shè)為靠左對齊
yellowButton.contentHorizontalAlignment = .left
yellowButton.contentVerticalAlignment = .center //image左移20
yellowButton.imageEdgeInsets = UIEdgeInsetsMake(0, 20, 0, -20)//title左移20宝踪,并且與image之間間隔20
yellowButton.titleEdgeInsets = UIEdgeInsetsMake(0, 40, 0, -40)//image左移20,已經(jīng)使button左側(cè)的間隔是20了
yellowButton.contentEdgeInsets = UIEdgeInsetsMake(20, 0, 20, 60)

最后碍扔,完美??

ButtonEdgeInsets-Space-Result.jpg
例2:設(shè)置一個image在上居中瘩燥,title在下居中,兩者之間間距20不同,四周間距20的button厉膀。

這個看起來復(fù)雜一些,但也只是計算復(fù)雜一些~ 計算過程如下二拐,求出標(biāo)記問號的距離就行了:

ButtonEdgeInsets-Center.jpg
//設(shè)置水平和豎直的對齊方式
yellowButton.contentHorizontalAlignment = .left
yellowButton.contentVerticalAlignment = .top
let imageRect = yellowButton.imageView!.framelet 
let titleRect = yellowButton.titleLabel!.framelet 
let buttonRect = yellowButton.frame //圖中?1的值
let image_l = (buttonRect.size.width-imageRect.size.width)/2//確定image的位置
yellowButton.imageEdgeInsets = UIEdgeInsetsMake(20, image_l, -20, -image_l)//圖中?2的值
let title_l = imageRect.size.width-(buttonRect.size.width-titleRect.size.width)/2//圖中?3的值
let title_t = imageRect.size.height+40//title的位置可以確定了
yellowButton.titleEdgeInsets = UIEdgeInsetsMake(title_t, -title_l, -title_t, title_l)//圖中?4的值
let button_b = titleRect.size.height+60//計算圖中?5的值
let max_w = max(titleRect.size.width, imageRect.size.width)
let button_l = -(buttonRect.size.width-(max_w+20*2))/2//button要調(diào)整的大小確定了
yellowButton.contentEdgeInsets = UIEdgeInsetsMake(0, button_l, button_b, button_l)

運(yùn)行后的結(jié)果:

ButtonEdgeInsets-Center-Result.jpg

了解imageEdgeInsets服鹅、titleEdgeInsetscontentEdgeInsets后卓鹿,就可以隨心所欲的來設(shè)置自己的button了菱魔。

至此,總結(jié)完畢??

–End–

文章來源于意林的bolg的技術(shù)博客,意林授權(quán)
傳送門:http://shinancao.github.io/2016/12/15/iOS-UIButton-EdgeInsets/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末吟孙,一起剝皮案震驚了整個濱河市澜倦,隨后出現(xiàn)的幾起案子聚蝶,更是在濱河造成了極大的恐慌,老刑警劉巖藻治,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件碘勉,死亡現(xiàn)場離奇詭異,居然都是意外死亡桩卵,警方通過查閱死者的電腦和手機(jī)验靡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來雏节,“玉大人胜嗓,你說我怎么就攤上這事」痴В” “怎么了辞州?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長寥粹。 經(jīng)常有香客問我变过,道長,這世上最難降的妖魔是什么涝涤? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任媚狰,我火速辦了婚禮,結(jié)果婚禮上阔拳,老公的妹妹穿的比我還像新娘崭孤。我一直安慰自己,他們只是感情好糊肠,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布裳瘪。 她就那樣靜靜地躺著,像睡著了一般罪针。 火紅的嫁衣襯著肌膚如雪彭羹。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天泪酱,我揣著相機(jī)與錄音派殷,去河邊找鬼。 笑死墓阀,一個胖子當(dāng)著我的面吹牛毡惜,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播斯撮,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼经伙,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起帕膜,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤枣氧,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后垮刹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體达吞,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年荒典,在試婚紗的時候發(fā)現(xiàn)自己被綠了酪劫。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡寺董,死狀恐怖覆糟,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情遮咖,我是刑警寧澤搪桂,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站盯滚,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏酗电。R本人自食惡果不足惜魄藕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望撵术。 院中可真熱鬧背率,春花似錦、人聲如沸嫩与。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽划滋。三九已至饵筑,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間处坪,已是汗流浹背根资。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留同窘,地道東北人玄帕。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像想邦,于是被迫代替她去往敵國和親裤纹。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評論 2 355

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