AutoLayout學習體驗

首先,先引入一下一些前人大牛關於al(autolayout)的學習博客,我也是從這些博客中學習過來的。
html

http://jixuqianxing.github.io/blog/2014/12/16/21041216/   (AutoLayout之可視化佈局)ios

http://jixuqianxing.github.io/blog/2014/11/28/jing-tong-autolayout/  (AutoLayout實用技巧)git

http://jixuqianxing.github.io/blog/2014/12/11/20141212/#userconsent#   (AutoLayout之純代碼佈局)github

http://www.cocoachina.com/ios/20141217/10669.html     (iOS 8 AutoLayout與Size Class自悟)佈局


上面第一第二個連接是關於可視化界面的;第三個是VFL實現代碼佈局,通常我是使用可視化佈局的,但有時候有的界面會須要調整,會涉及到約束,這個時候會考慮用VFL來修改約束;第四個連接主要是size class的,size class是用來作旋轉適配的,文章中的例子很不錯,一句代碼不用就實現了各類機型不一樣方向下的不一樣佈局。學習


如今開始個人補充,如下的舉例用做幫助理解,嚴謹性不作考慮。動畫

1.壓縮阻力和內容吸附spa

若是使用UILabel或者UIButton或者UIImage,在其有文字或圖片內容的狀況下,使用al,你會發現只須要設置位置就能夠,而不用指定寬高。這是由於上面這幾個存在內在內容,有壓縮阻力和內容吸附(見下圖)code

上圖中標出的第一個是內容吸附,第二個是壓縮阻力,上圖是默認值。htm

顧名思義,壓縮阻力是指保護視圖內容的方式。壓縮阻力高的視圖能抵抗壓縮,不容許內容被剪切。當你設置UILabel或者UIButton(有內容)的約束,位置+固定寬高的時候,發生了約束的衝突或者丟失,許多時候就是由於壓縮阻力和固定寬高的約束衝突(解決方法是修改其中一個的優先級)。

內容吸附,是視圖防止與其核心內容間做填充或直接伸展其核心內容的做用。像UIButton的文字內容會處於按鈕正中央,而且和邊緣有必定的距離。當內容吸附優先級小的時候,UIButton的寬高很大,文字內容會被容許伸展,內容吸附優先級高的時候,即便寬高很大,文字內容仍是適應本身的內容尺寸,不容許被伸展。


2.優先級

優先級在al中是一個很重要的元素,發生衝突的解決方法就是修改優先級。

舉個例子,設置一個UILabel的壓縮阻力優先級是1000(最高優先級),UILabel的內容尺寸寬是150,又設置了UILabel的寬是固定100(默認的優先級也是1000),這個時候就發生約束衝突,由於內容尺寸寬比固定寬要大,不可能出現既不壓縮內容的狀況下固定寬高。解決方法是下降其中一個的優先級,好比下降固定寬的優先級到750,那麼運行時,會之內容尺寸寬做爲UILabel的寬;若是是下降壓縮阻力的優先級,那麼會顯示固定寬爲UILabel的寬。

優先級就是誰高執行誰。


3.倍數Multipliter

上圖中設置了一個Label和一個UIButton等寬,若是想設置Label的寬是Button的倍數,能夠經過這個屬性進行修改。


=====================懶得再寫新的而補充內容的分割線=========================

scrollView

scrollView在al中是一個比較特殊的存在,由於它有contentSize這個東西。通常的控件在使用al約束的時候,只須要約束住X、Y和寬高(有的寬高自適應),往其上加子視圖也是同樣。但往scrollView上加子視圖的時候不一樣,由於有contentSize的存在。

scrollView必須知道本身的內容的寬高,即便你不須要它滾動,也是須要的。

解決方法是往scrollView上添加一個view,做爲contentView,即內容視圖,設置這個contentView的約束是上下左右貼邊(即爲0)。這個時候仍是會爆約束缺失的紅點,由於咱們須要爲contentView指定滾動的方向,若是是上下滾動,設置約束水平居中,若是是左右滾動,設置約束垂直居中。再指定內容的尺寸,好比是上下滾動,給contentView再加一個高度約束,固定高度,這裏能夠先隨便給個高度,反正後面能夠改動。把這個高度約束設爲屬性(能夠經過xib的拉線拉爲屬性),這裏咱們能夠設置這個高度約束值是咱們想要的了,能夠是靜態指定值,也能夠是動態變化的。

能夠在viewDidLoad或者在updateViewConstraints裏設置y約束值,這個隨意。


動畫

al的狀況下作簡單的UIView的動畫,好比是某個view高度增高,要有個動畫效果,同樣先獲取這個view的高度約束,能夠是先將這個高度約束設爲一個屬性,也能夠是從for循環中循環出這個約束,而後先修改這個約束的值爲本身最終想要的值,再執行動畫,示例以下

    _viewHeightConstraint.constant = 100;
    [UIView animateWithDuration:3 animations:^{
        [self.view layoutIfNeeded];
    }];

layoutIfNeeded的做用是更新約束變化。

相關文章
相關標籤/搜索