iOS:Autolayout屏幕适配

说明:

Autolayout能实现Autoresizing所有的功能,可相对父View位置,也可相对同级兄弟View的位置。

 

一、图形操作方式:
(1)选中子View,在底部中间位置点第1个按钮(Align),在弹出Add New Alignment Constralnts对话框中选中以下一个或多个值,并确定。ps:所有设置后能计算出x、y、width、height的值,否则报错。
Leading Edges                   //View左边对齐其他View
Trailing Edges                  //View右边对齐其他View
Top Edges                       //设置2个View顶部对齐(同时选中2个View)
Bottom Edges                    //设置2个View底部对齐(同时选中2个View)
Horizontal Centers              //平级View水平对齐
Vertical Centers                //平级View垂直对齐
BaseLines                       //对齐某根线
Horizontal Center in Container  //在父View内部水平(左右)居中,确认View的X值
Vertical Center in Container    //在父View内部垂直(上下)居中,确定View的Y值
(2)选中子View,在底部中间位置点第2个按钮(Pin),在弹出中设置固定值,点"Add num Constraints"完成设置,预览中没有更新,可以点黄色警告解决(不是必须的,可以不设置)
可以选中left(默认距离状态栏,可以点向下箭头换成距离屏幕顶部)、
top、right、   //默认左右有空白,去掉勾选"Constrain tomargins"项就解决了
bottom(可以选择距离底部导航栏或屏幕)四个方向的边距线,并在输入框中设置值,设置View距离四个边距的值
Width:View固定宽度
Height:View固定高度
Equal Widths:跟另一个View同样宽度
Equal Heights:跟另一个View同样高度
Aspect Ratio:比例
Align:可选择哪种对齐方式(步骤1中的几个值)
(3)选中子View,在底部中间位置点第3个按钮(Resolve Auto Layout Lssues),用于解决一些自动布局的问题(不是必须的,可以不设置,用于清楚设置等)
(4)修改上面设置的约束
在左边选中Constrains内部某条约束,点右上角属性小图标,以下为说明:
First Item表示第一个View
Relation表示约束条件,如Equal
Second Item表示第二个View
Constant默认为0,可以修改此值实现位置偏移
Priority表示优先级
Multiplier表示倍数默认1,第1个View是第2个View的几倍,如0.5则为一半,


公式:第1个View的x = (第2个View + Constant) * Multiplier
公式:第2个View的top = (self.top + Constant) * Multiplier

 

二、代码实现方式:

(1)禁用autoresizing
View引用.translatesAutoresizingMaskIntoConstraints = NO;
(2)创建约束

方式1:
View1的参数1 =  
NSLayoutConstraint *lc = [NSLayoutConstraint constraintWithItem:View1引用 attribute:View1的参数 relatedBy:NSLayoutRelationEqual 
toItem:View2引用 attribute:View2参数 
mutiplier:值 constant:值];  //mutiplier表示倍数默认1,第1个View是第2个View的几倍,如0.5则为一半,Constant默认为0,可以修改此值实现位置偏移
attribute值列表如下:
NSLayoutAttributeLeft            //左侧
NSLayoutAttributeRight           //右侧
NSLayoutAttributeTop             //上方
NSLayoutAttributeBottom          //下方
NSLayoutAttributeLeading         //首部
NSLayoutAttributeTrailing        //尾部
NSLayoutAttributeWidth           //宽度
NSLayoutAttributeHeight          //高度
NSLayoutAttributeCenterX         //X轴中心
NSLayoutAttributeCenterY         //Y轴中心
NSLayoutAttributeBaseLine        //文本底标线
NSLayoutAttributeNotAnAttribute  //没有属性

方式2(VFL):

//vfl中用到的View集合

NSDictionary *views = @{@"key名称1" : view1引用,  @"key名称2" :  view2引用};

//vfl语句

//设置view1宽度值,View2宽度值,两者间隔值

H:(view引用1(宽度值)-两个View间隔值-(view2引用(宽度))

//设置view宽度大于等于指定宽度值,并设优先级

H(view引用(>=宽度值@优先级值))  //优先级最高为1000,越高越被满足

//设置view2位于view1下面,并且高度值等于view

V:(view1引用)-(view2引用(==view2引用))

//|表示父View的边缘

H:|-间隔值-(view1引用)-(view2引用)-(view3引用(>=宽度值))-|

//对齐方式,例NSLayoutFormatAlignAllRight

NSLayoutConstraint *lc = [NSLayoutConstraint constraintsWithVisualFormat:@"VFL语句" options: 对齐方式 metrics::vfl语句中用到的属性值的NSDictionary集合 views:vfl语句中用到的view的NSDictionary集合];


(3)给View添加约束
[View引用 addConstraint:lc];   //给View自已添加约束
[self.view addConstraint:lc]   //父View添加约束(非自身约束都要添加到父View)

 

三、基于Autolayout的动画:

(1)拖动Constraints中某个约束到ViewController代码编辑器中,Connection为Outlet,输入名称,Type为NSLayoutConstraint
@interface ViewController()
//拖到此处
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *lc;
@end
(2)动画改变constant的值
self.lc.constant += 数值;  //修改约束值,还没有重新计算
[UIView animateWithDuration:1.0 animations:^{
    [UIView引用 layoutIfNeeded];   //动画执行,根据新的约束值重新计算赋值frame
}];

 

四、Size Classes对屏幕进行分类(实现在不同分辨率下不同位置,最底部中间"wAny hAny"选项点开后可以看到9类屏幕分类):
9类屏幕:
wAny和hAny:任意尺寸
wCompact和hCompact:iphone的3.5寸、4寸、4.7寸横屏
wAny和hCompact:iphone所有横屏
wReqular和hCompact:iphone的5.5寸横屏
wReqular和hAny:iPad竖屏或横屏
wCompact和hAny:iphone的3.5寸、4寸、4.7寸竖屏或横屏
wCompact和hReqular:iphone所有竖屏
wAny和hReqular:iphone所有iphone竖屏或iPad横屏或竖屏
wReqular和hReqular:iPad竖屏或横屏
使用:
(1)拖动View到布局中,选中此View。
(2)最右上角属性图标中,拉最底下,点击"installed"左边有个"+",新建一个对应屏幕类型的"installed",默认是Any屏幕下的。
(3)最底部中间"wAny hAny"选项点开后可以看到9类屏幕分类,选中某个屏幕类型,设置控件Autolayout属性。

你可能感兴趣的:(iOS)