UIButton的contentEdgeInsets屬性的深入研究
-
由於用UIButton這個屬性做過一些東西,但是對它的規律始終不太了解,雖然蘋果官方文檔的解釋大體上可以理解為,這個屬性設置的是內邊距,更通俗點說,是規定,Button向內的多少區域其它控件是不能進入的。但是總存在一些奇怪的現象,所以我做了個Demo得出下面的規律。先看demo。可以下載自己嘗試。
-
我們先研究豎直方向上的,也就是頂部和底部向內推這個方向。代碼如下,我們先在StoryBoard上創建一個Button然后, 設置Button上的文字,並讓這個label自動換行,可以發現一開始Label的frame = {{3, 15}, {38, 41}}.然后我們打開豎直方向上的注釋, 會發現下面比上面多推了10個單位, 而且這時候20.5 + 30.5 + 41大於Button的高度71的,那么你估計出Label的Y值了么,我嘗試了很多出數據,得出了規律,此時Label是向上移動5給單位。也就是所處位置是{3, 10}.也就說,Label在豎直方向上的位置,取決於上下內邊距之差的絕對值乘以0.5。至於是原來y值加上還是減去, 這要看偏向父空那一邊,如果是底部往上推更多,那就是減去。
-
再來研究水平方向,我以為水平方向也如此。但是並非如此,水平方向是不會相互作用的,如果水平兩個方向的推進會將原來的Label進行壓縮,但是Label的面積不會變,也就是說給Label留下的寬度如果小於Label的寬度,那么Label就會被壓成這個寬度,然后會變長,所以當我們水平方向上壓縮到0時候,Label就會不見了,因為此時Label相當於無限的長,無限的細致。就算水平某一方推進的已經覆蓋掉了另外一方,Label還是會不存在。因為此時寬度是無限趨向於0
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"before setting insets%@", NSStringFromCGRect(self.button.frame));
//self.button.contentEdgeInsets = UIEdgeInsetsMake(0, 10, 71, 10);
[self.button setTitle:@"testestes" forState:UIControlStateNormal];
self.button.titleLabel.numberOfLines = 0;
self.button.titleLabel.backgroundColor = [UIColor blueColor];
self.button.frame = CGRectMake(198, 285, 44, 71);
self.button.backgroundColor = [UIColor redColor];
[self.button layoutIfNeeded];
NSLog(@"after setting titleLabel's frame = %@", NSStringFromCGRect(self.button.titleLabel.frame));
//self.button.contentEdgeInsets = UIEdgeInsetsMake(0, 22, 0,21); // 研究水平方向測試1
//self.button.contentEdgeInsets = UIEdgeInsetsMake(0, 21, 0,21); // 研究水平方向測試2
//self.button.contentEdgeInsets = UIEdgeInsetsMake(0, 20, 0,21); // 研究水平方向測試3
// self.button.contentEdgeInsets = UIEdgeInsetsMake(20.5, 0, 30.5,0); // 研究豎直方向測試2
[self.button layoutIfNeeded];
NSLog(@"after setting insets titleLabel's frame = %@", NSStringFromCGRect(self.button.titleLabel.frame));
NSLog(@"after setting insets%@", NSStringFromCGRect(self.button.frame));
// Do any additional setup after loading the view, typically from a nib.
*/
}
- 總結(兩點):
- UIButton設置內邊距的時候,內邊距 + 寬 <= UIButton的寬或者內邊距 + 高<= UIButton。那么是沒有問題的。Label的位置是不會變化的。
- 當UIButton的寬高不滿足上面的情況時候
- 豎直方向UILabel是硬的,水平方向是軟的。
- 豎直方向移動多少, 取決於上下內邊距之差的絕對值。
- 水平方向的UILabel的寬度取決於所留空間是否夠大於UILabel的寬。如果是,UILabel寬不會變, 如果不是的話,UILabel的寬就等於所留的寬, 高度於文字大小有關,如果寬度為擠壓寬度且不為零(擠壓寬度的意思是, 不是原來的寬, 是被擠壓過的寬),那么X的坐標就是左邊推進的高度。