iOS螢幕螢幕適配之 Auto Layout 1

2022-05-06 01:18:07 字數 1899 閱讀 5248

在iphone4s及其之前的iphone,螢幕尺寸一直是固定的3.5英吋,硬體解析度為320*480。那時候不存在螢幕適配的問題(當然排除同時相容ipad和iphone),直接用比較粗暴的方式把乙個view的位置寫死,比如下面的

- (void)viewdidload
產生的效果如下:

,從中可以看到,建立nslayoutconstraint一共有兩個類方法:

+ constraintswithvisualformat:options:metrics:views:

+ constraintwithitem:attribute:relatedby:toitem:attribute:multiplier:constant:

在本博文中,我們把上面3種方法中的第二種方法稱為「建立視覺化語言描述的約束」,第三種方法稱為「建立一般的約束」。下面我們分別討論這兩種方法。

從nslayoutconstraint.h中我們可以看到建立一般約束物件的類方法宣告:

+(instancetype)constraintwithitem:(id)view1 attribute:(nslayoutattribute)attr1 relatedby:(nslayoutrelation)relation toitem:(nullable id)view2 attribute:(nslayoutattribute)attr2 multiplier:(cgfloat)multiplier constant:(cgfloat)c;
該類方法中一共有7個引數,引數這麼多........還能不能愉快的程式設計了???不過仔細看一下,其實沒有那麼複雜了。

引數引數的作用

引數型別

引數1:view1

需要新增約束的檢視

乙個uiview及其子類

引數2:attr1

指定引數1需要做什麼樣的約束

列舉量nslayoutattribute

引數3:relation

與參照檢視屬性之間的關係,比如等於、小於、大於等

列舉量nslayoutrelation

引數4:view2

參照的檢視

nslayoutrelation

引數5:attr2

指定引數2需要做什麼樣的約束

列舉量nslayoutattribute

引數6:multiplier

倍數cgfloat型別

引數7:c

加數cgfloat

上述關係中view1.attr1 = view2.attr2 *multiplier + c(假如這裡relation為相等關係)

其中引數2和引數3的列舉量定義如下:

typedef ns_enum(nsinteger, nslayoutrelation) ;

typedef ns_enum(nsinteger, nslayoutattribute) ;

說了那麼多囉嗦的理論,現在我們進入實戰。假如我們有這樣的需要:需要產生乙個寬度和高度都為100點的正方形方塊,且它位於螢幕中心。入下圖所示。

- (void)createoneview
下面我們再來實現乙個這樣的需求:建立乙個包含3個矩形塊的介面,其中矩形塊與螢幕周邊的距離都為20點,矩形塊的邊與邊也相距20點,三個矩形塊一樣高,上面兩個寬度一樣。具體的樣子入下圖所示:

實現**如下:

- (void)createthreeviews
待續...

iOS 螢幕適配

螢幕適配 1 螢幕適配的發展過程 計算frame autoreszing 父控制項和子控制項的關係 autolayout 任何控制項都可以產生關係 sizeclass 沒有螢幕適配,直接使用frame固定子控制項的大小 螢幕大小一樣,但是如果進行ipad開發,就需要考慮螢幕適配 螢幕大小不一樣,需要...

iOS螢幕適配

ios的螢幕適配從純frame到autoresizingmask再到autolayout,autoresizingmask autolayout sizeclassesautoresizingmask和autolayout不相容 sizeclasses依賴autolayout autoresizin...

iOS螢幕適配

一 ios螢幕適配發展歷程 裝置適配技術 4及以前 ipad未出 直接用 計算 有了ipad autoresizing 有不同螢幕的iphone後 autolayout 有更多不同螢幕的iphone後 sizeclass 1 直接用 計算 由於螢幕的大小都一樣,只有橫豎屏的情況,可以直接計算 2 a...