在自動布局中使用優(yōu)先級圾结,除了上一篇自動布局技巧篇-Content Hugging Priority 和 Content Compression Resistance Priority講到的防壓縮或防拉伸情況下會使用,那么還有那些情況下會用到呢浇雹?
下面看一個場景她紫,要求實現(xiàn)下面的效果:
假設三個視圖分別是View1,View2,View3硅堆,最開始是view2距離view1二十個像素,view3距離view2二十個像素贿讹,而實際項目中渐逃,view2有時候有有時候沒有,有的話就是正常情況民褂,像上面三個排列茄菊,沒有的話,view3會取代view2的位置距離view1二十個像素赊堪,
解決上面的問題有很多種方式面殖,比如以下三種:
1 view3是基于view2,如果view2沒有,隱藏view2,將view3與view2之間間距約束設為0哭廉,并將view2寬度約束設為0
2?view3不基于view2脊僚,而是基于view1,距離view1最開始一個距離disView3ToView1(20*2+view2的寬度),當view2沒有的時候遵绰,隱藏view2,將disView3ToView1約束值設為20辽幌,
3 view3既基于view2增淹,又基于view1,就是view3距離view2,view3距離view1都有一個距離為20的約束就是disView3ToView2,disView3ToView1乌企,只不過剛開始view3到view2距離的優(yōu)先級要高于view3到view1距離的優(yōu)先級埠通,即disView3ToView2的priority>disView3ToView1的priority,后面如果view2沒有了,改變兩個距離對應的優(yōu)先級為逛犹,disView3ToView2的priority
前面兩種方法本質上是一樣的端辱,都是改變約束的值,來改變位置虽画,第三種方式而是通過改變約束優(yōu)先級的方式實現(xiàn)舞蔽,在一種情況下,這種約束滿足码撰,那么它的優(yōu)先級就高渗柿,另外一種情況下,另一種約束滿足脖岛,那么另一種約束優(yōu)先級就高映凳,顯然這種場景下,采用優(yōu)先級的方式更適合宿饱,
這里我們主要來看一下view3的約束:
點擊其中view3到view2的約束
點擊其中view3到view1的約束
注意:
上面本來默認添加一個約束的時候它的優(yōu)先級是1000壹无,那么按理來說上面那個999沒必要改啊,直接讓它使用默認值1000就可以啊绍在,為什么我要改成999呢门扇,或者為什么我不使用1000那個數(shù)值呢,是有原因的偿渡,因為后面我要改變這兩個優(yōu)先級(大的改小臼寄,小的改大),如果是1000的話溜宽,那么就意味著我可能會將1000改成小于1000的吉拳,小于1000的改成1000的,那么這樣就會有問題适揉,你用1000的話留攒,你就會發(fā)現(xiàn)報下面的錯誤
原來,具有優(yōu)先級1000(UILayoutPriorityRequired)的約束為強制約束(Required Constraint)涡扼,優(yōu)先級小于1000的約束為可選約束(Optional Constraint)稼跳,而優(yōu)先級的修改只允許在可選約束優(yōu)先級范圍內才能修改,換句話說:
不允許將優(yōu)先級由小于1000的值改為1000
不允許將優(yōu)先級由1000修改為小于1000的值
也就是只能在小于1000的范圍內修改吃沪,
所以上面專門把1000改成了999汤善,另一個則是998
下一步:把兩個約束拖出來
@property(weak,nonatomic)IBOutletNSLayoutConstraint*view3ToView1Constraint;
@property(weak,nonatomic)IBOutletNSLayoutConstraint*view3ToView2Constraint;
然后修改即可
self.view3ToView1Constraint.priority=999;
self.view3ToView2Constraint.priority=998;
這是一種場景,下面還有一種場景,
要求:正常情況下红淡,上面view和下面view不狮,等寬等高,上面視圖寬度變化在旱,下面視圖寬度也隨著變化摇零,但是下面視圖有一個最大寬度250,到達了這個寬度后桶蝎,便不再增大驻仅,
分析:
這里下面的view關鍵是兩個約束
1 和上面的view等寬
2 最大寬度250
如果這兩個約束優(yōu)先級一樣的話,那么當上面視圖寬度超過250的時候登渣,會報錯噪服,實際運行會出現(xiàn)未知情況,
所以兩個約束必然要有一個優(yōu)先級要高些胜茧,因為當寬度大于250的時候粘优,最大寬度這個約束得起作用,肯定要比等寬的約束作用力度要大些呻顽,所以最大寬度約束的優(yōu)先級>等寬約束的優(yōu)先級雹顺,還是采用小于1000的形式,防止以后會改變它們廊遍,如下:
寬度約束:
等寬約束:
那么可以總結一下什么場景下該使用優(yōu)先級了:
對于一個視圖,正常情況下嬉愧,它有一個約束constriant1,特殊情況下它又有一個約束constraint2,這個view不管現(xiàn)在處于哪一種情況,只可能是這兩個約束中的一個起作用(不一定會相互沖突比如例子2昧碉,但同一種情況只可能是其中一個約束在起作用)英染,那么這個時候這個約束的優(yōu)先級就要高于另外一個揽惹,相反一樣被饿。
demo地址https://github.com/aszkj/KJAutoLayoutSillDemo