iOS - Swift自定義UIButton的圖片方向

【Swift】自定義UIButton的圖片方向

給UIButton擴(kuò)展imagePosition方法用于設(shè)置圖片相對(duì)于文字的方向

//
//  UIButton+ImgPositionExt.swift
//  Comic
//
//  Created by LRS on 2022/4/13.
//

import UIKit

    extension UIButton {
    //MARK: 定義button相對(duì)label的位置
    enum ButtonImgPosition {
        ///圖片在上惧辈,文字在下,垂直居中對(duì)齊
        case top
        ///圖片在下,文字在上吨悍,垂直居中對(duì)齊
        case bottom
        ///圖片在左裆馒,文字在右健无,水平居中對(duì)齊
        case left
        ///圖片在右回溺,文字在左啤贩,水平居中對(duì)齊
        case right
    }
    
    /// - imagePosition 設(shè)置Button圖片的位置
    /// - Parameters:
    ///  - style: 圖片位置
    ///  - spacing: 按鈕圖片與文字之間的間隔
    func imagePosition(style:ButtonImgPosition,spacing:CGFloat){
        self.layoutIfNeeded()
        
        self.imageView?.contentMode = .scaleAspectFit
        self.imageView?.sizeToFit()
        //得到button的imageView和titleLabel的寬高
        let imgvWidth = self.imageView?.frame.size.width
        let imgvHeight = self.imageView?.frame.size.height
        
        var labelWidth:CGFloat! = 0.0
        var labelHeight:CGFloat! = 0.0
    
        self.titleLabel?.sizeToFit()
        labelWidth = self.titleLabel?.intrinsicContentSize.width
        labelHeight = self.titleLabel?.intrinsicContentSize.height
        //labelWidth = self.titleLabel?.size.width
        //labelHeight = self.titleLabel?.size.height
        
        if (style == .right || style == .left) {
            if labelWidth > (self.width - spacing - imgvWidth!) {
                labelWidth = (self.width - spacing - imgvWidth!)
                self.titleLabel!.width = labelWidth
            }
        }else if (style == .top || style == .bottom){
            if labelWidth > self.width {
                labelWidth = self.width
                self.titleLabel!.width = labelWidth
            }
        }
        
        
        //初始化imageEdgeInsets和labelEdgeInsets
        var imageEdgeInsets = UIEdgeInsets.zero
        var labelEdgeInsets = UIEdgeInsets.zero
        //根據(jù)style和space得到imageEdgeInsets和labelEdgeInsets的值
        switch style {
        case .top:
            //順序 上 左 下 右
            imageEdgeInsets = UIEdgeInsets(top: -labelHeight-spacing/2.0,
                                           left: 0.0,
                                           bottom: 0.0,
                                           right: -labelWidth)
            
            labelEdgeInsets = UIEdgeInsets(top: 0.0,
                                           left: -imgvWidth!,
                                           bottom: -imgvHeight!-spacing/2.0,
                                           right: 0.0)
        case .bottom:
            imageEdgeInsets = UIEdgeInsets(top: 0.0,
                                           left: 0.0,
                                           bottom: -labelHeight!-spacing/2.0,
                                           right: -labelWidth)
            
            labelEdgeInsets = UIEdgeInsets(top: -imgvHeight!-spacing/2.0,
                                           left: -imgvWidth!,
                                           bottom: 0.0,
                                           right: 0.0)
        case .left:
            imageEdgeInsets = UIEdgeInsets(top: 0.0,
                                           left: -spacing/2.0,
                                           bottom: 0.0,
                                           right: spacing)
            labelEdgeInsets = UIEdgeInsets(top: 0.0,
                                           left: spacing/2.0,
                                           bottom: 0.0,
                                           right: -spacing/2)
        case .right:
            
            imageEdgeInsets = UIEdgeInsets(top: 0.0,
                                           left: labelWidth+spacing/2,
                                           bottom: 0.0,
                                           right: -labelWidth-spacing/2)
            labelEdgeInsets = UIEdgeInsets(top: 0.0,
                                           left: -imgvWidth!-spacing/2,
                                           bottom: 0.0,
                                           right: imgvWidth!+spacing/2)
            
        }
        self.titleEdgeInsets = labelEdgeInsets
        self.imageEdgeInsets = imageEdgeInsets
    }
}

用法

    //MARK: 定義button相對(duì)label的位置
    enum ButtonImgPosition {
        ///圖片在上茫打,文字在下居触,垂直居中對(duì)齊
        case top
        ///圖片在下,文字在上老赤,垂直居中對(duì)齊
        case bottom
        ///圖片在左轮洋,文字在右,水平居中對(duì)齊
        case left
        ///圖片在右抬旺,文字在左弊予,水平居中對(duì)齊
        case right
    }

說明:設(shè)置完button的size之后調(diào)用有效

       let btn = UIButton(type: .custom).then { btn in
            btn.frame = CGRect(x: 50.0, y: 100.0, width: 80.0, height: 80.0)
            btn.backgroundColor = .red
            //設(shè)置完button的size之后調(diào)用有效
            btn.imagePosition(style: .bottom, spacing: 5.0)
            btn.setImage(UIImage.imgColor(.green, CGSize(width: 40, height: 40)), for: .normal)
            btn.setTitle("你好", for: .normal)
        }
        view.addSubview(btn)
      
        btn.layoutIfNeeded()
        btn.imagePosition(style: .bottom, spacing: 5.0)

效果

UIButton-圖片在文字下方

\color{gray}{歡迎大佬兒來指正糾錯(cuò),共同學(xué)習(xí)???啤汉柒!}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市责鳍,隨后出現(xiàn)的幾起案子碾褂,更是在濱河造成了極大的恐慌,老刑警劉巖历葛,帶你破解...
    沈念sama閱讀 219,589評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件正塌,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)乓诽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門帜羊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人鸠天,你說我怎么就攤上這事逮壁。” “怎么了粮宛?”我有些...
    開封第一講書人閱讀 165,933評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵窥淆,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我巍杈,道長(zhǎng)忧饭,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,976評(píng)論 1 295
  • 正文 為了忘掉前任筷畦,我火速辦了婚禮词裤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘鳖宾。我一直安慰自己吼砂,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,999評(píng)論 6 393
  • 文/花漫 我一把揭開白布鼎文。 她就那樣靜靜地躺著渔肩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪拇惋。 梳的紋絲不亂的頭發(fā)上周偎,一...
    開封第一講書人閱讀 51,775評(píng)論 1 307
  • 那天,我揣著相機(jī)與錄音撑帖,去河邊找鬼蓉坎。 笑死,一個(gè)胖子當(dāng)著我的面吹牛胡嘿,可吹牛的內(nèi)容都是我干的蛉艾。 我是一名探鬼主播,決...
    沈念sama閱讀 40,474評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼衷敌,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼勿侯!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起逢享,我...
    開封第一講書人閱讀 39,359評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤罐监,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后瞒爬,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,854評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,007評(píng)論 3 338
  • 正文 我和宋清朗相戀三年侧但,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了矢空。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,146評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡禀横,死狀恐怖屁药,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情柏锄,我是刑警寧澤酿箭,帶...
    沈念sama閱讀 35,826評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站趾娃,受9級(jí)特大地震影響缭嫡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜抬闷,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,484評(píng)論 3 331
  • 文/蒙蒙 一妇蛀、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧笤成,春花似錦评架、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至培遵,卻和暖如春挣磨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背荤懂。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工茁裙, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人节仿。 一個(gè)月前我還...
    沈念sama閱讀 48,420評(píng)論 3 373
  • 正文 我出身青樓晤锥,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親廊宪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子矾瘾,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,107評(píng)論 2 356

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