AutoLayout 約束就是等式或不等式

2021-07-10 17:00:34 字數 1678 閱讀 7128

ps:本文面向的讀者是已經接觸過autolayout的,如果你還未接觸過,那本文內容可能不大容易消化,關掉本頁或點返回可能會更好,在資訊氾濫的當下避免攝入過量的資訊也是一種智慧型。一般情況下我們知道autolayout會自動計算檢視(view)的大小(size)和位置(position),但是前提得設定好合理的約束。這裡的第乙個特別重要的概念約束(constraint)就出來了!跟我們的題目有什麼關係呢,其實約束就是一些等式或不等式,這些等式或不等式就代表著檢視之間的關係

上圖中出現了乙個最簡單的例子,乙個「red」檢視,乙個「blue」檢視,中間有一條8個點(point)的約束,說的是「red」檢視的左邊距(leading)由「blue」檢視的右邊距和乙個常量8決定。

表示式中的item1,老外什麼都喜歡叫item,基本就和中文的「個」差不多了,這個item1指的就是「red」這個檢視。

「red」檢視的attribute1(屬性1)是leading,相信有玩過autolayout的朋友會相當熟悉,top/leading/bottom/trailing這四個對齊的屬性,在語言習慣是從左到右的情況下(希伯來文和阿拉伯語是從右到左),leading其實就是left,而trailing就是right,語言習慣是從右到左時則相反。總之這裡就是邊距的意思啦,當然還有width/height,vertical center 和horizontal center這幾個,都是屬性。

multiplier是倍數,這個一般是自己設定的,比如當你需要兩個view的寬度成倍數時,就和這個multiplier關聯起來了。

item2和attribute2是另乙個檢視的內容,意思同item1和attribute1。

constantc按字面理解就是常量啦,由圖可知兩個檢視之間的間距就是8。

上面只是舉了乙個最簡單的例子,每個檢視基本都有約束,而每個約束都可以像上面那樣用等式或不等式來表示,上邊距、下邊距、寬度、高度等等都可以。

再看下面乙個例子

這是乙個比較普遍的需求,乙個label加乙個textfield,用於使用者輸入姓名。

約束1表明了namelabel的左邊距要和父檢視(superview)的左邊距相等

約束2表明了nametextfield的右邊距要和父檢視的右邊距相等

約束3表明了nametextfield的左邊距是namelabel的右邊距加上乙個常量

約束4表明了nametextfield的上邊距是toplayoutguide的下邊加上常量20.0,toplayoutguide是你建立xib或sb時就存在的。

約束5表明了namelabel的基準線要和nametextfield的基準線相等,關於基準線這裡要說幾句,基準線只適用於帶文字的檢視,也就是說你不帶文字了,基準線就沒用。

圖中隱含的內容還有很多,比如intrinsic content size(固定內容大小),chcr,優先順序等,不過本文想指出的是約束其實就是等式或不等式,所以這些內容先忽略,後面有空再寫文章詳細說明。

AutoLayout比例約束

本文記錄如何在 uistoryboard 或者 xib 中進行百分比布局,包括 在 ios nslayoutconstraint priority 一文中提到過 multiplier,上述提到的百分比布局都是基於 multiplier 實現的,下面來一一檢視其實現。view.width 佔其 sup...

iOS自動化布局 AutoLayout約束優先順序

autolayout新增的約束中也有優先順序 priority 優先順序的數值1 1000,分為兩種情況 當uilabel顯示的內容過長或太短,控制項就會被拉伸和壓縮,當我們不想讓控制項被拉伸壓縮時,就需要設定控制項的固有約束 intinsic content size 來實現我們的需求。固有約束分...

Mysql 細節補充,約束 索引等

約束 顯示建表語句 show create table 表名 查詢表中的約束 select from information schema.table constraints where table name 表名 新增約束 alter table 表名 add unique key 約束名 列1 ...