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ù)奠货,專門(mén)用來(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ū)域