iOS-如何調(diào)整UIButton子視圖的位置

以下代碼是筆者再工作中總結(jié)得來的,如果錯誤澳迫,請多多指教动知!
給按鈕創(chuàng)建個分類UIButton+EdgeInsets,然后將代碼拷貝到對應(yīng)文件即可

  • UIButton+EdgeInsets.h文件
/**
 圖片在左,文字在右
 
 @param space 圖片和文字的間隔
 */
- (void)imageOnLeftWithSpace:(CGFloat)space;

/**
 圖片在右神得,文字在左
 
 @param space 圖片和文字的間隔
 */
- (void)imageOnRightWithSpace:(CGFloat)space;

/**
 圖片在上,文字在下
 
 @param space 圖片和文字的間隔
 */
- (void)imageOnTopWithSpace:(CGFloat)space;

/**
 圖片在下饥侵,文字在上

 @param space 圖片和文字的間隔
 */
- (void)imageOnBottomWithSpace:(CGFloat)space;

/**
 用于有圖片有文字的按鈕鸵赫。
 功能:設(shè)置圖片和文字之間的間距,并且可設(shè)置內(nèi)容距離父視圖左邊的間距

 @param space1 圖片和文字之家的間距
 @param space2 內(nèi)容距離父視圖左邊的間距
 */
- (void)imageOnLeftWithSpace:(CGFloat)space1 contentLeftSpace:(CGFloat)space2;
  • UIButton+EdgeInsets.m文件
- (void)imageOnLeftWithSpace:(CGFloat)space
{
    [self layoutIfNeeded];
    
    self.titleEdgeInsets
    = UIEdgeInsetsMake(
                       0,// top
                       space * 0.5,// left
                       0,// bottom
                       - space * 0.5);// right
    
    self.imageEdgeInsets
    = UIEdgeInsetsMake(
                       0,// top
                       - space * 0.5,// left
                       0,// bottom
                       space * 0.5);// right
}

- (void)imageOnRightWithSpace:(CGFloat)space
{
    [self layoutIfNeeded];
    
    self.titleEdgeInsets
    = UIEdgeInsetsMake(0,// top
                       - self.imageView.bounds.size.width - space * 0.5,// left
                       0,// bottom
                       self.imageView.bounds.size.width + space * 0.5);// right
    self.imageEdgeInsets
    = UIEdgeInsetsMake(0,// top
                       self.titleLabel.bounds.size.width + space * 0.5,// left
                       0,// bottom
                       - self.titleLabel.bounds.size.width - space * 0.5);// right
}

- (void)imageOnTopWithSpace:(CGFloat)space
{
    [self layoutIfNeeded];
    
    BOOL holisticUpMove = self.titleLabel.bounds.size.height > self.imageView.bounds.size.height;
    
    CGFloat offset = fabs(self.imageView.bounds.size.height - self.titleLabel.bounds.size.height) / 2;
    
    CGFloat imageTop = 0;
    CGFloat imageLeft = 0;
    CGFloat imageBottom = 0;
    CGFloat imageRight = 0;
    
    if (holisticUpMove) {
        // 整體上移
        imageTop = -self.imageView.bounds.size.height * 0.5 - offset - space * 0.5;
        imageLeft = self.titleLabel.bounds.size.width * 0.5;
        imageBottom = self.imageView.bounds.size.height * 0.5 + offset + space * 0.5;
        imageRight = - self.titleLabel.bounds.size.width * 0.5;
    }else {
        // 整體下移
        imageTop = -self.imageView.bounds.size.height * 0.5 + offset - space * 0.5;
        imageLeft = self.titleLabel.bounds.size.width * 0.5;
        imageBottom = self.imageView.bounds.size.height * 0.5 - offset + space * 0.5;
        imageRight = - self.titleLabel.bounds.size.width * 0.5;
    }
    
    self.imageEdgeInsets
    = UIEdgeInsetsMake(
                       imageTop,// top
                       imageLeft,// left
                       imageBottom,// bottom
                       imageRight);// right
    
    CGFloat labelTop = 0;
    CGFloat labelLeft = 0;
    CGFloat labelBottom = 0;
    CGFloat labelRight = 0;
    
    if (holisticUpMove) {
        // 整體上移
        labelTop = self.titleLabel.bounds.size.height * 0.5 - offset + space * 0.5;
        labelLeft = - self.imageView.bounds.size.width * 0.5;
        labelBottom = -self.titleLabel.bounds.size.height * 0.5 + offset - space * 0.5;
        labelRight = self.imageView.bounds.size.width * 0.5;
    }else {
        // 整體下移
        labelTop = self.titleLabel.bounds.size.height * 0.5 + offset + space * 0.5;
        labelLeft = - self.imageView.bounds.size.width * 0.5;
        labelBottom = -self.titleLabel.bounds.size.height * 0.5 - offset - space * 0.5;
        labelRight = self.imageView.bounds.size.width * 0.5;
    }
    
    self.titleEdgeInsets
    = UIEdgeInsetsMake(
                       labelTop,// top
                       labelLeft,// left
                       labelBottom,// bottom
                       labelRight);// right
}

- (void)imageOnBottomWithSpace:(CGFloat)space
{
    [self layoutIfNeeded];
    
    BOOL holisticUpMove = self.imageView.bounds.size.height > self.titleLabel.bounds.size.height;
    
    CGFloat offset = fabs(self.imageView.bounds.size.height - self.titleLabel.bounds.size.height) / 2;
    
    CGFloat imageTop = 0;
    CGFloat imageLeft = 0;
    CGFloat imageBottom = 0;
    CGFloat imageRight = 0;
    
    if (holisticUpMove) {
        // 整體需要上移
        imageTop = self.imageView.bounds.size.height * 0.5 - offset + space * 0.5;
        imageLeft = self.titleLabel.bounds.size.width * 0.5;
        imageBottom = - self.imageView.bounds.size.height * 0.5 + offset - space * 0.5;
        imageRight = - self.titleLabel.bounds.size.width * 0.5;
    }else {
        // 整體需要下移
        imageTop = self.imageView.bounds.size.height * 0.5 + offset + space * 0.5;
        imageLeft = self.titleLabel.bounds.size.width * 0.5;
        imageBottom = - self.imageView.bounds.size.height * 0.5 - offset - space * 0.5;
        imageRight = - self.titleLabel.bounds.size.width * 0.5;
    }
    
    self.imageEdgeInsets
    = UIEdgeInsetsMake(
                       imageTop,// top
                       imageLeft,// left
                       imageBottom,// bottom
                       imageRight);// right
    
    CGFloat labelTop = 0;
    CGFloat labelLeft = 0;
    CGFloat labelBottom = 0;
    CGFloat labelRight = 0;
    if (holisticUpMove) {
        // 整體上移
        labelTop = - self.titleLabel.bounds.size.height * 0.5 - offset - space * 0.5;
        labelLeft = - self.imageView.bounds.size.width * 0.5;
        labelBottom = self.titleLabel.bounds.size.height * 0.5 + offset + space * 0.5;
        labelRight = self.imageView.bounds.size.width * 0.5;
    }else {
        // 整體下移
        labelTop = - self.titleLabel.bounds.size.height * 0.5 + offset - space * 0.5;
        labelLeft = - self.imageView.bounds.size.width * 0.5;
        labelBottom = self.titleLabel.bounds.size.height * 0.5 - offset + space * 0.5;
        labelRight = self.imageView.bounds.size.width * 0.5;
    }
    
    self.titleEdgeInsets
    = UIEdgeInsetsMake(
                       labelTop,// top
                       labelLeft,// left
                       labelBottom,// bottom
                       labelRight);// right
}

- (void)imageOnLeftWithSpace:(CGFloat)space1 contentLeftSpace:(CGFloat)space2
{
    [self imageOnLeftWithSpace:space1];
    CGFloat insetLeft = self.imageView.frame.origin.x - space2;
    self.contentEdgeInsets = UIEdgeInsetsMake(0, - insetLeft, 0, insetLeft);
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末躏升,一起剝皮案震驚了整個濱河市辩棒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌膨疏,老刑警劉巖盗温,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異成肘,居然都是意外死亡,警方通過查閱死者的電腦和手機斧蜕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進(jìn)店門双霍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人批销,你說我怎么就攤上這事洒闸。” “怎么了均芽?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵丘逸,是天一觀的道長。 經(jīng)常有香客問我掀宋,道長深纲,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任劲妙,我火速辦了婚禮湃鹊,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘镣奋。我一直安慰自己币呵,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布侨颈。 她就那樣靜靜地躺著余赢,像睡著了一般。 火紅的嫁衣襯著肌膚如雪哈垢。 梳的紋絲不亂的頭發(fā)上妻柒,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天,我揣著相機與錄音温赔,去河邊找鬼蛤奢。 笑死鬼癣,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的啤贩。 我是一名探鬼主播待秃,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼痹屹!你這毒婦竟也來了章郁?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤志衍,失蹤者是張志新(化名)和其女友劉穎暖庄,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體楼肪,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡培廓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了春叫。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肩钠。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖暂殖,靈堂內(nèi)的尸體忽然破棺而出价匠,到底是詐尸還是另有隱情,我是刑警寧澤呛每,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布踩窖,位于F島的核電站,受9級特大地震影響晨横,放射性物質(zhì)發(fā)生泄漏洋腮。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一手形、第九天 我趴在偏房一處隱蔽的房頂上張望徐矩。 院中可真熱鬧,春花似錦叁幢、人聲如沸滤灯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鳞骤。三九已至,卻和暖如春黍判,著一層夾襖步出監(jiān)牢的瞬間豫尽,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工顷帖, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留美旧,地道東北人渤滞。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像榴嗅,于是被迫代替她去往敵國和親妄呕。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,864評論 2 354

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

  • 1嗽测、通過CocoaPods安裝項目名稱項目信息 AFNetworking網(wǎng)絡(luò)請求組件 FMDB本地數(shù)據(jù)庫組件 SD...
    陽明先生_X自主閱讀 15,980評論 3 119
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,116評論 25 707
  • 這是一個悲傷的故事绪励,男豬腳在付出了真愛與財富后,相愛多年的女友離開了他唠粥。 1 楠楓和薇兒是大學(xué)同班同學(xué)疏魏,楠楓第一眼...
    丁小喵治愈說閱讀 180評論 0 0
  • 這周轉(zhuǎn)瞬即逝,收獲很多晤愧。 周日早上5公里大莫,這次基本上一口氣跑完,最后沖刺有點早官份,所以差了200米葵硕,配速也達(dá)到了6:...
    Martino777閱讀 198評論 0 1
  • 目標(biāo):1、希望孩子擁有更多朋友更加開心快樂贯吓!智慧多多!不計較蜀变!不抱怨悄谐!能夠心平氣和的說話!不著急库北!不上火爬舰!我倆不干...
    zl向日葵閱讀 169評論 0 0