蘋果在iOS2
中引入了Autoresizing
技術用于屏幕適配, 其用于指定當父視圖的bounds
發(fā)生改變時如何自動調整子視圖的布局
通過Code
使用Autoresizing
技術
Autoresizing
技術涉及到兩個UIView
的屬性: autoresizesSubviews
屬性用于標識當自身的bounds
發(fā)生改變時是否自動調整子視圖的布局; autoresizingMask
屬性用于標識當父視圖的bounds
發(fā)生改變時如何自動調整自身的布局
// 默認為YES
@property(nonatomic) BOOL autoresizesSubviews;
// 默認為UIViewAutoresizingNone
@property(nonatomic) UIViewAutoresizing autoresizingMask;
autoresizingMask
屬性的取值為UIViewAutoresizing
枚舉, 可以采用位運算(按位或)同時設置多個值
UIViewAutoresizingNone = 0, 不執(zhí)行任何調整
UIViewAutoresizingFlexibleLeftMargin = 1 << 0, 自動調整與父視圖的左邊距
UIViewAutoresizingFlexibleWidth = 1 << 1, 自動調整自身的寬度
UIViewAutoresizingFlexibleRightMargin = 1 << 2, 自動調整與父視圖的右邊距
UIViewAutoresizingFlexibleTopMargin = 1 << 3, 自動調整與父視圖的上邊距
UIViewAutoresizingFlexibleHeight = 1 << 4, 自動調整自身的高度
UIViewAutoresizingFlexibleBottomMargin = 1 << 5, 自動調整與父視圖的下邊距
注: 每個值僅用于標識子視圖如何調整指定維度的布局. 例如:
UIViewAutoresizingFlexibleLeftMargin
僅用于標識子視圖自動調整與父視圖的左邊距, 并不影響如何調整自身的寬度和與父視圖的右邊距
如果UIView
的autoresizesSubviews
屬性設置為YES
, 當它的bounds
發(fā)生改變時, 它會根據每個子視圖的autoresizingMask
屬性設置自動為其調整布局
// 示例: 讓子視圖的寬度和高度保持不變, 且與父視圖的右邊距和下邊距均固定為20pt
CGFloat width = [[UIScreen mainScreen] bounds].size.width;
CGFloat height = [[UIScreen mainScreen] bounds].size.height;
UIView *redView = [[UIView alloc] initWithFrame:CGRectMake(width-120, height-120, 100, 100)];
redView.backgroundColor = [UIColor redColor];
redView.autoresizingMask = UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleLeftMargin;
[self.view addSubview:redView];
如果UIView
的autoresizingMask
屬性在同一個軸線上同時設置了多個值, 默認行為是根據各自維度的可調整部分按照比例來分配調整部分. 例如: 如果UIView
的autoresizingMask
屬性設置在x
軸上包含UIViewAutoresizingFlexibleWidth
和UIViewAutoresizingFlexibleRightMargin
, 而不包含UIViewAutoresizingFlexibleLeftMargin
, 則代表與父視圖的左邊距是固定的, 而自身的寬度和與父視圖右邊距會根據各自維度的可調整部分按照比例發(fā)生變化
// 示例: 讓子視圖與父視圖的右邊距和下邊距均固定為20pt, 且與父視圖的左邊距和自身的寬度按照比例自動調整
CGFloat width = [[UIScreen mainScreen] bounds].size.width;
CGFloat height = [[UIScreen mainScreen] bounds].size.height;
UIView *redView = [[UIView alloc] initWithFrame:CGRectMake(width-120, height-120, 100, 100)];
redView.backgroundColor = [UIColor redColor];
redView.autoresizingMask = UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleWidth;
[self.view addSubview:redView];
通過IB
使用Autoresizing
技術
IB
中的設置最終都會轉化為Code
運行, 所以我們在這部分只需要了解如何設置autoresizesSubviews
屬性和autoresizingMask
屬性即可
我們在父視圖的Attributes inspector
中設置autoresizesSubviews
屬性, 用于標識當自身的bounds
發(fā)生改變時是否自動調整子視圖的布局
我們在子視圖的中設置autoresizingMask
屬性, 用于標識當父視圖的bounds
發(fā)生改變時如何自動調整自身的布局
autoresizingMask
屬性的設置由六根線標識, 其中位于外部的四根線分別用于標識如何自動調整與父視圖的上、下菩帝、左垒棋、右邊距; 位于內部的兩根線分別用于標識如何自動調整自身的寬度和高度
注: 位于外部的四根線(柱狀線段), 如果是實線即代表不自動調整; 位于內部的兩根線(箭頭線段), 如果是實線即代表自動調整
下面再次通過IB
的方式實現(xiàn)Code
方式的兩個示例
示例: 讓子視圖的寬度和高度保持不變, 且與父視圖的右邊距和下邊距均固定為20pt
示例: 讓子視圖與父視圖的右邊距和下邊距均固定為20pt, 且與父視圖的左邊距和自身的寬度按照比例自動調整
注: 如果
Xcode
中默認開啟了Autolayout
技術, 在使用Autoresizing
技術前需要手動將其關閉
兩種方式的區(qū)別
IB
中的設置最終都會轉化為Code
運行, 所以二者在本質上沒有任何區(qū)別. 但是在設置autoresizingMask
屬性時, 二者的思考方式不同
在Code
中, autoresizingMask
屬性顯式設置的值即代表自動調整, 未設置的值即代表不自動調整
在IB
中, autoresizingMask
屬性位于外部的四根線(柱狀線段), 如果是實線即代表不自動調整; 位于內部的兩根線(箭頭線段), 如果是實線即代表自動調整
下面通過兩個示例對比說明
示例: 讓子視圖與父視圖的上残腌、下、左匪蝙、右邊距保持不變, 且自身的寬度和高度自動調整
redView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
示例: 讓子視圖與父視圖的上灭贷、下、左宙枷、右邊距以及自身的寬度和高度按照比例自動調整
redView.autoresizingMask = UIViewContentModeLeft | UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleBottomMargin;
注: 如果
Autoresizing
技術不能滿足你對界面的精確布局需求, 你可以使用一個自定義視圖作為容器, 并通過重寫其layoutSubviews
方法來精確地布局其子視圖, 或者使用iOS6
新引入的Autolayout
技術來進行精確布局