上週終於把前段的密集課程及考試什麼的完成了,有時間來review下YoNote裏的代碼。雖然說代碼好像寫了很多,但能說的好像不太多==這篇準備說下使用AutoLayout的一些感覺。佈局
個人理解是,AutoLayout是經過對界面上各個元素設定約束,來達到在各個不一樣設備上統一佈局的目的。spa
實現AutoLayout整體上說有兩種方式,一種是在Xib裏直接設置,另外一種是使用代碼。其中使用代碼的方式經常使用的有如下幾種:code
對我來講,蘋果那堆代碼太繁瑣抽象,Masonry沒去看過==,因此要麼用Xib,要麼用PureLayout。到底選用哪種,通常取決於須要佈局的元素的複雜程度。若是須要控制的元素不少或者是一個View上有不少子View,我會選擇用Xib,畢竟代碼寫起來太費時間了;相反,若是界面不復雜、要控制的元素比較少,或者元素可能會發生變化,我會考慮用代碼,使用啊或者控制方便一些。blog
這個我還不能像某大神那麼自信地說「什麼界面都能在兩(半)小時裏作出來」連接,偶爾有的元素仍是會不乖亂跑,可是大致上有個思路。get
個人思路是抓住主要矛盾,在佈局中究竟是哪一個元素是「自變量」,由於它別的元素的位置纔會跟着變化,先肯定自變量,別的元素跟着就肯定下來了。it
好比YoNote的ItemCell,效果圖以下:io
分析能夠知道它的問題在於memoLabel內容顯示這個view必須固定在左上方,並且與collectionLabel的距離是固定的;同時imageView也必須固定在右邊。
具體來講,在這個cell裏面,memoLabel和imageView是必須首先固定的,由於三個label都與imageView有必定的距離,這個距離只有當imageView固定以後才能肯定;一樣,collectionLabel與memoLabel的距離也只有當memoLabel固定以後才能肯定。class
因而,按這個思路,先固定imageView(與父視圖contentView的上下右距離肯定)變量
[self.iv autoPinEdgesToSuperviewEdgesWithInsets:ALEdgeInsetsMake(kLabelVerticalInsets, kLabelHorizontalInsets, kLabelVerticalInsets, kLabelHorizontalInsets) excludingEdge:ALEdgeLeading];
而後是memoLabel,與父視圖的左邊及上邊肯定,而後肯定高度以及和imageView的距離。(寬度不用管了,左邊與父視圖的距離以及右邊與imageView的距離肯定就能肯定寬度,高度必定要固定,方能固定collectionLabel)方法
[self.memoLabel autoPinEdgeToSuperviewEdge:ALEdgeTop withInset:kLabelVerticalInsets]; [self.memoLabel autoPinEdgeToSuperviewEdge:ALEdgeLeading withInset:kLabelHorizontalInsets]; [self.memoLabel autoSetDimension:ALDimensionHeight toSize:kMemoLabelHeightToSize]; [self.memoLabel autoPinEdge:ALEdgeTrailing toEdge:ALEdgeLeading ofView:self.iv withOffset:-kLabelHorizontalInsets relation:NSLayoutRelationLessThanOrEqual];
最後是collectionLabel和tagLabel,與父視圖保持左邊的距離,同時collectionLabel與memoLabel以及tagLabel在上下保持距離。
[self.collectionNameLabel autoPinEdgeToSuperviewEdge:ALEdgeLeading withInset:kLabelHorizontalInsets]; [self.tagLabel autoPinEdgeToSuperviewEdge:ALEdgeLeading withInset:kLabelHorizontalInsets]; [self.collectionNameLabel autoPinEdge:ALEdgeTop toEdge:ALEdgeBottom ofView:self.memoLabel withOffset:kLabelVerticalInsets]; [self.collectionNameLabel autoPinEdge:ALEdgeBottom toEdge:ALEdgeTop ofView:self.tagLabel withOffset:-kLabelVerticalInsets];
Done!