蘋果在iOS2
中引入了Autoresizing
技術用於屏幕適配, 其用於指定當父視圖的bounds
發生改變時如何自動調整子視圖的佈局佈局
Code
使用Autoresizing
技術Autoresizing
技術涉及到兩個UIView
的屬性: autoresizesSubviews
屬性用於標識當自身的bounds
發生改變時是否自動調整子視圖的佈局; autoresizingMask
屬性用於標識當父視圖的bounds
發生改變時如何自動調整自身的佈局ui
// 默認爲YES
@property(nonatomic) BOOL autoresizesSubviews;
// 默認爲UIViewAutoresizingNone
@property(nonatomic) UIViewAutoresizing autoresizingMask;複製代碼
autoresizingMask
屬性的取值爲UIViewAutoresizing
枚舉, 能夠採用位運算(按位或)同時設置多個值atom
UIViewAutoresizingNone = 0, 不執行任何調整
UIViewAutoresizingFlexibleLeftMargin = 1 << 0, 自動調整與父視圖的左邊距
UIViewAutoresizingFlexibleWidth = 1 << 1, 自動調整自身的寬度
UIViewAutoresizingFlexibleRightMargin = 1 << 2, 自動調整與父視圖的右邊距
UIViewAutoresizingFlexibleTopMargin = 1 << 3, 自動調整與父視圖的上邊距
UIViewAutoresizingFlexibleHeight = 1 << 4, 自動調整自身的高度
UIViewAutoresizingFlexibleBottomMargin = 1 << 5, 自動調整與父視圖的下邊距複製代碼
注: 每一個值僅用於標識子視圖如何調整指定維度的佈局. 例如:
UIViewAutoresizingFlexibleLeftMargin
僅用於標識子視圖自動調整與父視圖的左邊距, 並不影響如何調整自身的寬度和與父視圖的右邊距spa
若是UIView
的autoresizesSubviews
屬性設置爲YES
, 當它的bounds
發生改變時, 它會根據每一個子視圖的autoresizingMask
屬性設置自動爲其調整佈局3d
// 示例: 讓子視圖的寬度和高度保持不變, 且與父視圖的右邊距和下邊距均固定爲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
, 則表明與父視圖的左邊距是固定的, 而自身的寬度和與父視圖右邊距會根據各自維度的可調整部分按照比例發生變化code
// 示例: 讓子視圖與父視圖的右邊距和下邊距均固定爲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
屬性便可cdn
咱們在父視圖的Attributes inspector
中設置autoresizesSubviews
屬性, 用於標識當自身的bounds
發生改變時是否自動調整子視圖的佈局blog
咱們在子視圖的中設置autoresizingMask
屬性, 用於標識當父視圖的bounds
發生改變時如何自動調整自身的佈局it
autoresizingMask
屬性的設置由六根線標識, 其中位於外部的四根線分別用於標識如何自動調整與父視圖的上、下、左、右邊距; 位於內部的兩根線分別用於標識如何自動調整自身的寬度和高度io
注: 位於外部的四根線(柱狀線段), 若是是實線即表明不自動調整; 位於內部的兩根線(箭頭線段), 若是是實線即表明自動調整
下面再次經過IB
的方式實現Code
方式的兩個示例
示例: 讓子視圖的寬度和高度保持不變, 且與父視圖的右邊距和下邊距均固定爲20pt
示例: 讓子視圖與父視圖的右邊距和下邊距均固定爲20pt, 且與父視圖的左邊距和自身的寬度按照比例自動調整
注: 若是
Xcode
中默認開啓了Autolayout
技術, 在使用Autoresizing
技術前須要手動將其關閉
IB
中的設置最終都會轉化爲Code
運行, 因此兩者在本質上沒有任何區別. 可是在設置autoresizingMask
屬性時, 兩者的思考方式不一樣
在Code
中, autoresizingMask
屬性顯式設置的值即表明自動調整, 未設置的值即表明不自動調整
在IB
中, autoresizingMask
屬性位於外部的四根線(柱狀線段), 若是是實線即表明不自動調整; 位於內部的兩根線(箭頭線段), 若是是實線即表明自動調整
下面經過兩個示例對比說明
示例: 讓子視圖與父視圖的上、下、左、右邊距保持不變, 且自身的寬度和高度自動調整
redView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;複製代碼
示例: 讓子視圖與父視圖的上、下、左、右邊距以及自身的寬度和高度按照比例自動調整
redView.autoresizingMask = UIViewContentModeLeft | UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleBottomMargin;複製代碼
注: 若是
Autoresizing
技術不能知足你對界面的精確佈局需求, 你能夠使用一個自定義視圖做爲容器, 並經過重寫其layoutSubviews
方法來精確地佈局其子視圖, 或者使用iOS6
新引入的Autolayout
技術來進行精確佈局