在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...