iOS | 理解UIEdgeInsets并創(chuàng)建上下布局的UIButton

友情提示:最終效果可跳至文章末尾Step 4處

先在View中初始化一個最基本的帶有圖片和文字的UIButton

let button = UIButton(type: .custom)
button.setImage(UIImage(named: "tab_bar_list_off"), for: .normal)
button.setImage(UIImage(named: "tab_bar_list_on"), for: .highlighted)
button.setTitle("列表", for: .normal)
button.sizeToFit()
button.backgroundColor = .red
button.center = view.center
view.addSubview(button)

此時頁面中的按鈕狀態(tài)為


初始化UIButton

UIEdgeInsets的初始化方法為

UIEdgeInsets(top: CGFloat, left: CGFloat, bottom: CGFloat, right: CGFloat)

其中包含的四個參數(shù)意義為:元素的某個邊界基于原位置將要移動的距離,正值為靠近控件矩形區(qū)域的中心,負值為遠離控件矩形區(qū)域的中心。
例如:

button.titleEdgeInsets = UIEdgeInsets(top: 10, left: 0, bottom: 0, right: -10)

意味著將按鈕的文字分別向下、向右移動了10像素,效果如下


UIEdgeInsets(top: 10, left: 0, bottom: 0, right: -10)

又例如:

button.titleEdgeInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 10)

效果顯示為


UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 10)

是因為只將文字的右側(cè)向左移動,而沒有將文字左側(cè)也做相應(yīng)移動,因此空間顯示不開,所以正確的方法應(yīng)該是

button.titleEdgeInsets = UIEdgeInsets(top: 0, left: -10, bottom: 0, right: 10)

效果如下


UIEdgeInsets(top: 0, left: -10, bottom: 0, right: 10)

由此可以清楚,若要構(gòu)建垂直布局的UIButton,應(yīng)該分一下幾步

  1. 分別獲取圖標的尺寸和文字的尺寸
  2. 將圖標和文字移動到Button的中心
  3. 將圖標向上移動某個高度,將文字向下移動某個高度,視需求而定
  4. 有必要的話,將UIButton的Frame進行重新調(diào)整

例如:
Step 1:

if let titleSize = button.titleLabel?.intrinsicContentSize, let iconSize = button.currentImage?.size {
            
}

Step 2: 這里對于居中的處理,我個人喜歡將圖標和文字都拉伸成按鈕的寬度,這樣從視覺上就是居中的狀態(tài)

if let titleSize = button.titleLabel?.intrinsicContentSize, let iconSize = button.currentImage?.size {
    button.titleEdgeInsets = UIEdgeInsets(top: 0, left: -iconSize.width, bottom: 0, right: 0)
    button.imageEdgeInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: -titleSize.width)
}

居中后的效果:


圖標和文字居中

Step 3:

if let titleSize = button.titleLabel?.intrinsicContentSize, let iconSize = button.currentImage?.size {
    let titleVerOffset = titleSize.height / 2
    button.titleEdgeInsets = UIEdgeInsets(top: titleVerOffset,
                                          left: -iconSize.width,
                                          bottom: -titleVerOffset,
                                          right: 0)
    let iconVerOffset = iconSize.height / 2
    button.imageEdgeInsets = UIEdgeInsets(top: -iconVerOffset,
                                          left: 0,
                                          bottom: iconVerOffset,
                                          right: -titleSize.width)
}

效果如下,可以看到圖標和文字都已經(jīng)超過了按鈕的邊界了


上圖下字

Step 4:

if let titleSize = button.titleLabel?.intrinsicContentSize, let iconSize = button.currentImage?.size {
    let titleVerOffset = titleSize.height / 2
    button.titleEdgeInsets = UIEdgeInsets(top: titleVerOffset,
                                          left: -iconSize.width,
                                          bottom: -titleVerOffset,
                                          right: 0)
    let iconVerOffset = iconSize.height / 2
    button.imageEdgeInsets = UIEdgeInsets(top: -iconVerOffset,
                                          left: 0,
                                          bottom: iconVerOffset,
                                          right: -titleSize.width)
    button.frame = CGRect(origin: button.frame.origin,
                          size: CGSize(width: button.bounds.size.width,
                                       height: iconSize.height + titleSize.height))
}

最終效果:


上圖下字UIButton

后續(xù)可以根據(jù)不同的需求對按鈕進行進一步的調(diào)整,例如在圖標和文字中間加入一定的間距等,原理也都跳不出以上的步驟。再進一步,可以將此段代碼抽離成獨立方法,方便將來頻繁調(diào)用,在此就不多做贅述,希望對有此需求的朋友有所幫助。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 雁灘未見聞鳥鳴,知己相邀踏春行; 滿園春色花欲語,清風樓閣孕心情; 桃花深處賞美景,嬌艷花蕾撲鼻香; 醉美人生林深...
    月夜秋荷閱讀 638評論 0 9
  • 頭疼,看不進書,寫點東西總是好的。 想起自己以前發(fā)過一條“即使沒有傘,也不要在雨中奔跑”的微博,也許該將它寫開來,...
    茵蔚閱讀 500評論 0 6
  • 一早出門辦事,細細的白砂糖,稀疏的飄落發(fā)絲。真好,小小雪天。 事畢,中午,漫步街頭,體會詩意:春有百花秋有月,夏有...
    貓虎虎閱讀 422評論 1 4
  • 凌山抒壯志,蕩??v豪情, 握柏說堅硬,倚松笑晚風。 草生低谷里,霜雪伴梅紅, 莫笑桑榆老,夕陽耀古城。
    云逸1108閱讀 115評論 0 1

友情鏈接更多精彩內(nèi)容