1.屏幕適配 系統(tǒng)適配
什么是適配?
適應(yīng)、兼容各種不同的情況
移動(dòng)開(kāi)發(fā)中,適配的常見(jiàn)種類
系統(tǒng)適配:針對(duì)不同版本的操作系統(tǒng)進(jìn)行適配
屏幕適配:針對(duì)不同大小的屏幕尺寸進(jìn)行適配
屏幕適配
iPhone的尺寸:3.5inch、4.0inch、4.7inch、5.5inch
iPad的尺寸:7.9inch、9.7inch
屏幕方向: 豎屏 橫屏

2.Autoresizing
在Autolayout之前,有Autoresizing可以作屏幕適配,但局限性較大,有些任務(wù)根本無(wú)法完成
相比之下,Autolayout的功能比Autoresizing強(qiáng)大很多
3.Autolayout
Autolayout是一種自動(dòng)布局技術(shù),專門用來(lái)布局UI界面的
Autolayout自iOS 6開(kāi)始引入,由于Xcode 4的不給力,當(dāng)時(shí)并沒(méi)有得到很大推廣
自iOS 7(Xcode 5)開(kāi)始,Autolayout的開(kāi)發(fā)效率得到很大的提升
蘋(píng)果官方也推薦開(kāi)發(fā)者盡量使用Autolayout來(lái)布局UI界面
Autolayout能很輕松地解決屏幕適配的問(wèn)題
Autolayout的2個(gè)核心概念:參照 約束



Autolayout的警告和錯(cuò)誤:
警告:控件的frame不匹配所添加的約束, 比如
比如約束控件的寬度為100, 而控件現(xiàn)在的寬度是110
錯(cuò)誤:缺乏必要的約束, 比如
只約束了寬度和高度, 沒(méi)有約束具體的位置
兩個(gè)約束沖突, 比如
1個(gè)約束控件的寬度為100, 1個(gè)約束控件的寬度為110
4.代碼實(shí)現(xiàn)Autolayout
代碼實(shí)現(xiàn)Autolayout的步驟
利用NSLayoutConstraint類創(chuàng)建具體的約束對(duì)象
添加約束對(duì)象到相應(yīng)的view上
- (void)addConstraint:(NSLayoutConstraint *)constraint;
- (void)addConstraints:(NSArray *)constraints;
代碼實(shí)現(xiàn)Autolayout的注意點(diǎn):
1>要先禁止autoresizing功能,設(shè)置view的下面屬性為NO
view.translatesAutoresizingMaskIntoConstraints = NO;
2>添加約束之前,一定要保證相關(guān)控件都已經(jīng)在各自的父控件上
3>不用再給view設(shè)置frame
4.1NSLayoutConstraint
一個(gè)NSLayoutConstraint對(duì)象就代表一個(gè)約束
創(chuàng)建約束對(duì)象的常用方法
+(id)constraintWithItem:(id)view1
attribute:(NSLayoutAttribute)attr1
relatedBy:(NSLayoutRelation)relation
toItem:(id)view2
attribute:(NSLayoutAttribute)attr2
multiplier:(CGFloat)multiplier
constant:(CGFloat)c;
view1 :要約束的控件
attr1 :約束的類型(做怎樣的約束)
relation :與參照控件之間的關(guān)系
view2 :參照的控件
attr2 :約束的類型(做怎樣的約束)
multiplier :乘數(shù)
c :常量
自動(dòng)布局的核心計(jì)算公式
obj1.property1 =(obj2.property2 * multiplier)+ constant value
4.2添加約束的規(guī)則
在創(chuàng)建約束之后,需要將其添加到作用的view上
在添加時(shí)要注意目標(biāo)view需要遵循以下規(guī)則:
1)對(duì)于兩個(gè)同層級(jí)view之間的約束關(guān)系,添加到它們的父view上

2)對(duì)于兩個(gè)不同層級(jí)view之間的約束關(guān)系,添加到他們最近的共同父view上

3)對(duì)于有層次關(guān)系的兩個(gè)view之間的約束關(guān)系,添加到層次較高的父view上

5.VFL語(yǔ)言 Visual Format Language 可視化格式語(yǔ)言
VFL是蘋(píng)果公司為了簡(jiǎn)化Autolayout的編碼而推出的抽象語(yǔ)言

H:[cancelButton(72)]-12-[acceptButton(50)]
//canelButton寬72,acceptButton寬50,它們之間間距12
H:[wideView(>=60@700)]
//wideView寬度大于等于60point,該約束條件優(yōu)先級(jí)為700
//(優(yōu)先級(jí)最大值為1000,優(yōu)先級(jí)越高的約束越先被滿足)
V:[redBox][yellowBox(==redBox)]
//豎直方向上,先有一個(gè)redBox,其下方緊接一個(gè)高度等于redBox高度的yellowBox
H:|-10-[Find]-[FindNext]-[FindField(>=20)]-|
//水平方向上,F(xiàn)ind距離父view左邊緣默認(rèn)間隔寬度,之后是FindNext距離Find間隔默認(rèn)寬度;
//再之后是寬度不小于20的FindField,它和FindNext以及父view右邊緣的間距都是默認(rèn)寬度。
//(豎線“|” 表示superview的邊緣)
使用VFL來(lái)創(chuàng)建約束數(shù)組
+ (NSArray *)constraintsWithVisualFormat:(NSString *)format
options:(NSLayoutFormatOptions)opts
metrics:(NSDictionary *)metrics
views:(NSDictionary *)views;
format :VFL語(yǔ)句
opts :約束類型
metrics :VFL語(yǔ)句中用到的具體數(shù)值
views :VFL語(yǔ)句中用到的控件
創(chuàng)建一個(gè)字典(內(nèi)部包含VFL語(yǔ)句中用到的控件)的快捷宏定義
NSDictionaryOfVariableBindings(...)
6.基于Autolayout的動(dòng)畫(huà)
在修改了約束之后,只要執(zhí)行下面代碼,就能做動(dòng)畫(huà)效果
[UIView animateWithDuration:1.0 animations:^{
[添加了約束的view layoutIfNeeded];
}];
7.Masonry
目前最流行的Autolayout第三方框架
用優(yōu)雅的代碼方式編寫(xiě)Autolayout
省去了蘋(píng)果官方惡心的Autolayout代碼
大大提高了開(kāi)發(fā)效率
框架地址: https://github.com/SnapKit/Masonry
7.1mas_equalTo和equalTo
默認(rèn)情況下
mas_equalTo有自動(dòng)包裝功能,比如自動(dòng)將20包裝為@20
equalTo沒(méi)有自動(dòng)包裝功能
如果添加了下面的宏,那么mas_equalTo和equalTo就沒(méi)有區(qū)別
#define MAS_SHORTHAND_GLOBALS
// 注意:這個(gè)宏一定要添加到#import "Masonry.h"前面
7.2mas_width和width
默認(rèn)情況下
width是make對(duì)象的一個(gè)屬性,用來(lái)添加寬度約束用的,表示對(duì)寬度進(jìn)行約束
mas_width是一個(gè)屬性值,用來(lái)當(dāng)做equalTo的參數(shù),表示某個(gè)控件的寬度屬性
如果添加了下面的宏,mas_width也可以寫(xiě)成width
#define MAS_SHORTHAND
mas_height、mas_centerX以此類推
以下方法都僅僅是為了提高可讀性,可有可無(wú)
- (MASConstraint *)with {
return self;
}
- (MASConstraint *)and {
return self;
}
8.有了Autolayout的UILabel
在沒(méi)有Autolayout之前,UILabel的文字內(nèi)容總是居中顯示,導(dǎo)致頂部和底部會(huì)有一大片空缺區(qū)域
有Autolayout之后,UILabel的bounds默認(rèn)會(huì)自動(dòng)包住所有的文字內(nèi)容,頂部和底部不再會(huì)有空缺區(qū)域
