原文網址:http://tutuge.me/2015/05/23/autolayout-example-with-masonry/html
很久沒有寫Blog了,這段時間有點忙啊=。=
本文舉了3個比較有「特色」的Autolayout例子,源於微博上好友的提問,感受比較有意思,也比較有表明性,就寫了出來,分享給你們~
至於爲何用Masonry,那是由於它好用啊!(被問到過有關Masonry的問題,就索性用它來實現吧=。=)。ios
https://github.com/zekunyan/AutolayoutExampleWithMasonrygit
實現的時候採用的是用StoryBoard拖拽約束+Masonry手寫代碼相結合的方式實現。最關鍵的地方是用Masonry,爲了更好地突出重點。其它的可有可無的空間約束,直接就拖拽了。github
剛開始學習Autolayout的時候,什麼「Leading Edges」、「Horizontal Centers」,好多啊,感受一會兒適應不來,有時候面對一個界面佈局上的需求,可能都無從下手。app
總的來講,我以爲Autolayout的關鍵就是「Constraint(約束)」。其實就是如下兩點:less
既然沒有了具體設置View的frame屬性,也就是說,系統會在運行時,經過咱們設定的「約束」,計算出每一個View的frame,再去繪製屏幕內容。ide
也就是說,咱們設置的Constraint,要能體現出View的位置(x、y座標)、大小(寬高)。不管是用IB拖拽約束,仍是手寫代碼,只要從這個角度去思考,不少問題就都能解決。函數
有關Autolayout的知識,網上有不少,在這裏就不詳細列出了,可是有個公式卻是能夠貼出來:佈局
1 |
viewA-attribute = viewB-attribute * multiplier + constant |
好用!學習
遇到這種跟內容壓縮、優先級有關的佈局,就不得不提Autolayout中的兩個重要的屬性「Content Compression Resistance」和「Content Hugging」。
對,這個屬性說白了就是「不準擠我」=。=
這個屬性的優先級(Priority)越高,越不「容易」被壓縮。也就是說,當總體的空間裝不下全部的View的時候,Content Compression Resistance優先級越高的,顯示的內容越完整。
這個屬性的優先級越高,整個View就要越「抱緊」View裏面的內容。也就是View的大小不會隨着父級View的擴大而擴大。
根據要求,能夠將約束分爲兩個部分:
重點:
關鍵的代碼以下:(label1是左邊的label,label2是右邊的)
1 |
// label1: 位於左上角 |
1 |
//設置label1的content hugging 爲1000 |
靈活運用「Content Compression Resistance」和「Content Hugging」屬性。
先看看示例的截圖:
下面的四個Switch控件分別控制上面對應位置的圖片是否顯示。
解釋
之因此這麼設置,主要目的有如下幾點:
先看看最外層容器View的代碼:
1 |
//containerView 就是 容器View |
循環建立每一個內部的imageView
1 |
//循環建立、添加imageView |
最後是循環對imageView加上約束: 感謝XVXVXXX的PR:-D
1 |
//設定大小 |
控制ImageView顯示、隱藏的時候,直接讓其寬度等於0就行:
1 |
- (IBAction)showOrHideImage:(UISwitch *)sender { |
有時候用個「容器View」管理內部的View,每每會起到事半功倍的效果。並且在組織約束的時候,儘可能的將約束統一塊兒來,這樣能夠用一個函數去設置,減小代碼量。
其實這個很簡單=。= 再看看這個公式:
1 |
viewA-attribute = viewB-attribute * multiplier + constant |
這個是Autolayout裏面一個約束的不一樣屬性的基本組合關係,替換成寬度的話,就是下面這樣:
1 |
子View的寬度 = 父級View寬度 * 係數 + 常數; |
在Masonry裏面,其實有個函數「multipliedBy」,就是用來設置multipler屬性的(跟本來的NSLayoutConstraint的對應)。
以下:
1 |
[subView mas_makeConstraints:^(MASConstraintMaker *make) { |
接着,只要控制父級View的寬度,子View的寬度就會隨着變化了。
multipliedBy在Masonry的Github主頁裏面沒有=。=
因此要養成讀頭文件的習慣~
有關Autolayout的東西還有好多沒有寫,什麼動畫啊、動態修改約束之類的,本文也算是個引子吧,任重而道遠~
能看到這的朋友,也算是頗有耐心了,哈哈~~