這個拖延癥真是害人,本來很早之前就該總結(jié)的,又拖到了今天。
最近在接手一個老項目的時候,原來的程序員是這樣做的

但是這里的手勢點擊過程是背景變色還是圖片變灰都達不到UIButton的原生點擊效果,所以我就改完UIButton來實現(xiàn)。
一般添加圖片和文字的UIButton的按鈕樣式的這樣的:
[bidBtn setImage:[UIImage imageNamed:@"LPBid"] forState:UIControlStateNormal];
[bidBtn setTitle:@"招標(biāo)公告" forState:UIControlStateNormal];

達不到右邊的效果,于是在網(wǎng)上開始尋找方法,很容易就找到這兩個屬性imageEdgeInsets和titleEdgeInsets,作用就是調(diào)整圖片和文字在按鈕里面的位置。二話不說開始調(diào)整...好像可以了,換個手機測試一下。明明在5s上達到右邊的效果了,在7p上:

調(diào)整的時候明明按照的比列在移動,但是在不同的屏幕上就是不一樣。
然后在找的過程中還發(fā)現(xiàn)了這個屬性,contentHorizontalAlignment和contentVerticalAlignment,以前也看到過,以為是可以讓內(nèi)容垂直。但是用了一下,才發(fā)現(xiàn),像原始的設(shè)置的圖片和文字就是圖2,默認(rèn)的屬性是這樣的:
bidBtn.contentHorizontalAlignment = UIControlContentHorizontalAlignmentCenter;
bidBtn.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
而且這個時候,圖片和文字是一個整體,一個整體,即你只調(diào)整一個edge屬性,另外一個也會換位置,要想破除這個魔咒,只有設(shè)置
bidBtn.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
bidBtn.contentVerticalAlignment = UIControlContentVerticalAlignmentTop;

這個圖片和文字的樣式下,可以輕松的調(diào)整了,還有一點忘記說了,imageEdgeInsets和titleEdgeInsets使用的時候,是基于沒有調(diào)整前的圖片或者文字的位置,不是以UIButton的(0,0)位置為原點

而是箭頭的起點處為起點,這也導(dǎo)致了調(diào)整的難度。
又有一個小知識點:
1.當(dāng)button.width < image.width時,只顯示被壓縮后的圖片,圖片是按fillXY的方式壓縮。
2.當(dāng)button.width > image.width,且 button.width < (image.width + text.width)時,圖片正常顯示,文本被壓縮。
3.當(dāng)button.width > (image.width + text.width),兩者并列默認(rèn)居中顯示,可通過button的屬性contentHorizontalAlignment改變對齊方式。
我們就是第三種方式下的調(diào)整;
回到上面設(shè)置好圖片和文字靠左和靠上對齊后,
bidBtn.imageEdgeInsets = UIEdgeInsetsMake(0.2 * bidBtn.frame.size.height, (bidBtn.frame.size.width - bidBtn.imageView.frame.size.width) / 2, 0, 0);
這四個值分別是距離上-左-下-右的各邊距,(bidBtn.frame.size.width - bidBtn.imageView.frame.size.width) / 2,就是圖片的距離左邊的距離,0.2 * bidBtn.frame.size.height,是距離上邊的距離這個,

下面調(diào)整文字,
bidBtn.titleEdgeInsets = UIEdgeInsetsMake(0.2 * bidBtn.frame.size.height + bidBtn.imageView.frame.size.height + 0.05 * bidBtn.frame.size.height, (bidBtn.frame.size.width - bidBtn.titleLabel.frame.size.width) / 2 - bidBtn.imageView.frame.size.width, 0, 0);

這里要注意文字距離左邊的距離不能安按鈕的左邊來計算了,不能用黃色線條,而是黑色直線的距離,原始招標(biāo)公告在紅色處,這里才是起點。0.2 * bidBtn.frame.size.height + bidBtn.imageView.frame.size.height + 0.05 * bidBtn.frame.size.height,是圖片的上邊距加上圖片本身的高度加上圖片和文字的間隔, (bidBtn.frame.size.width - bidBtn.titleLabel.frame.size.width) / 2 - bidBtn.imageView.frame.size.width是黃色的距離減去圖片的寬度得到的黑色長度,這個時候文字就來到中心處。
自此大功告成。
完整的代碼:
UIButton * bidBtn = [UIButton buttonWithType:UIButtonTypeCustom];
bidBtn.frame = CGRectMake(0, 0, TTScreenWith / 2 - 1, 100*SCALE);
float heigh = bidBtn.frame.size.height;
bidBtn.backgroundColor = [UIColor whiteColor];
bidBtn.tag = 0;
[bidBtn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
[bidBtn.titleLabel setFont:[UIFont systemFontOfSize:14]];
[bidBtn setImage:[UIImage imageNamed:@"LPBid"] forState:UIControlStateNormal];
[bidBtn setTitle:@"招標(biāo)公告" forState:UIControlStateNormal];
[bidBtn addTarget:self action:@selector(clickLeftBid:) forControlEvents:UIControlEventTouchUpInside];
bidBtn.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
bidBtn.contentVerticalAlignment = UIControlContentVerticalAlignmentTop;
bidBtn.imageEdgeInsets = UIEdgeInsetsMake(0.2 * bidBtn.frame.size.height, (bidBtn.frame.size.width - bidBtn.imageView.frame.size.width) / 2, 0, 0);
bidBtn.titleEdgeInsets = UIEdgeInsetsMake(0.2 * bidBtn.frame.size.height + bidBtn.imageView.frame.size.height + 0.05 * heigh, (bidBtn.frame.size.width - bidBtn.titleLabel.frame.size.width) / 2 - bidBtn.imageView.frame.size.width, 0, 0);
[cell.contentView addSubview:bidBtn];
其實還應(yīng)該計算一下完整的高度,即圖片和文字的看成一個整體,讓這個整體的中心和按鈕的中心處重合。
由于UIButton是添加在Cell上的要看如何在UITableView和UIScrollView上UIbutton的正常點擊效果實現(xiàn),可以看我上一篇。