屏幕適配的發(fā)展歷史
-
iPhone3GS\iPhone4
- 沒有屏幕適配可言
- 全部用frame邮辽、bounds唠雕、center進(jìn)行布局
- 很多這樣的現(xiàn)象:坐標(biāo)值、寬度高度值全部寫死 objc UIButton *btn1 = [[UIButton alloc] init]; btn1.frame = CGRectMake(0, 0, 320 - b, 480 - c);
iPad出現(xiàn)吨述、iPhone橫屏
出現(xiàn)Autoresizing技術(shù)
讓橫豎屏適配相對簡單
讓子控件可以跟隨父控件的行為自動(dòng)發(fā)生相應(yīng)的變化
前提是:關(guān)閉Autolayout功能
-
局限性
- 只能解決子控件跟父控件的相對關(guān)系問題
- 不能解決兄弟控件的相對關(guān)系問題
iOS 6.0(Xcode4)開始
出現(xiàn)了Autolayout技術(shù)
從Xcode5.0(iOS 7.0)開始岩睁,開始流行Autolayout
-
Xib預(yù)覽可以查看所有設(shè)備下的當(dāng)前控件的位置
Xib預(yù)覽可以查看所有設(shè)備下的當(dāng)前控件的位置 -
Autoresizing
- 在Autolayout之前,有Autoresizing可以作屏幕適配揣云,但局限性較大捕儒,有些任務(wù)根本無法完成
- 相比之下,Autolayout的功能比Autoresizing強(qiáng)大很多
-
Autolayout的2個(gè)核心概念
- 參照
-
約束
Autolayout常用面板01-約束處理.png
Autolayout常用面板03-對齊.png
Autolayout常用面板02-相對.png
-
Autolayout的警告和錯(cuò)誤
-
警告
- 控件的frame不匹配所添加的約束, 比如
- 比如約束控件的寬度為100, 而控件現(xiàn)在的寬度是110
-
錯(cuò)誤
- 缺乏必要的約束, 比如
- 只約束了寬度和高度, 沒有約束具體的位置
-
兩個(gè)約束沖突, 比如
- 1個(gè)約束控件的寬度為100, 1個(gè)約束控件的寬度為110
-
警告
-
關(guān)于Autolayout的動(dòng)畫
- Autolayout的動(dòng)畫 用普通的方法改變約束的值
UIView animateWithDuration:2.0 animations:^{ //[改變約束的值] 這種做法是沒有動(dòng)畫效果 }]; [UIView animateWithDuration:2.0 animations:^{ /** * 想要AutoLayout的約束有動(dòng)畫,需要調(diào)用控件的[控件名字 layoutIfNeeded]方法 */ [self.blueView layoutIfNeeded]; }];
-
代碼實(shí)現(xiàn)AutoLayout
- 代碼實(shí)現(xiàn)Autolayout的步驟
- 利用NSLayoutConstraint類創(chuàng)建具體的約束對象
- 添加約束對象到相應(yīng)的view上
- 代碼實(shí)現(xiàn)Autolayout的注意點(diǎn)
- 要先禁止autoresizing功能刘莹,設(shè)置view的下面屬性為NO
- view.translatesAutoresizingMaskIntoConstraints = NO;
- 添加約束之前阎毅,一定要保證相關(guān)控件都已經(jīng)在各自的父控件上
- 不用再給view設(shè)置frame
/**
- view1 :要約束的控件
- attr1 :約束的類型(做怎樣的約束)距離左右上下
- relation :與參照控件之間的關(guān)系
- NSLayoutRelationLessThanOrEqual小于等于
- NSLayoutRelationEqual 等于
- NSLayoutRelationGreaterThanOrEqual 大于等于
- toItem: 和其他控件做比較
- view2 :參照的控件
- attr2 :約束的類型(做怎樣的約束)
- multiplier :乘數(shù)
- c :常量
*/
+(instancetype)constraintWithItem:(id)view1
attribute:(NSLayoutAttribute)attr1
relatedBy:(NSLayoutRelation)relation
toItem:(nullable id)view2
attribute:(NSLayoutAttribute)attr2
multiplier:(CGFloat)multiplier
constant:(CGFloat)c;
- Masonry簡介
- 目前最流行的Autolayout第三方框架
- 用優(yōu)雅的代碼方式編寫Autolayout
- 省去了蘋果官方惡心的Autolayout代碼
- 大大提高了開發(fā)效率
- 框架地址 https://github.com/SnapKit/Masonry
- Masonry的基本使用
-
默認(rèn)情況下
- mas_equalTo有自動(dòng)包裝功能,比如自動(dòng)將20包裝為@20
- equalTo沒有自動(dòng)包裝功能
-
mas_equalTo和equalTo
- 如果添加了下面的宏点弯,那么mas_equalTo和equalTo就沒有區(qū)別
- (#)define MAS_SHORTHAND_GLOBALS
- 注意:這個(gè)宏一定要添加到#import "Masonry.h"前面
-
默認(rèn)情況下
- width是make對象的一個(gè)屬性扇调,用來添加寬度約束用的,表示對寬度進(jìn)行約束
- mas_width是一個(gè)屬性值抢肛,用來當(dāng)做equalTo的參數(shù)狼钮,表示某個(gè)控件的寬度屬性
-
mas_width和width
- 如果添加了下面的宏,mas_width也可以寫成width
- (#)define MAS_SHORTHAND
- mas_height捡絮、mas_centerX以此類推
demohttps://github.com/liuxingchen930831/UI-07-UIAutoLayout
-