iOS开发之Autolayout的使用

补充:iPhone6s plus 尺寸:5.5inch   分辨率:1920x1080数组

        iPhone6s  尺寸:4.7inch  分辨率:1334x750
布局


Autolayout是一种“自动布局”技术,专门用来布局UI界面,能很好的解决屏幕适配的问题。Autolayout的两个核心概念,参照和约束。编码

在storyboard中处理约束的几个经常使用面板:spa

    

ViewControllerScene右边若是出现则说明约束没有问题了,只须要update frames就行了,若是是则说明约束有问题,多是缺少必要的约束,也多是有两个约束冲突了。code

除了能够在storyboard中添加约束,也能够在代码中给控件添加约束,可是。。。感受好麻烦啊
orm

主要就是经过NSLayoutConstraint类建立具体的约束对象,并将约束对象添加到相应的view上。对象

添加约束对象方法:ip

- (void)addConstraint:(NSLayoutConstraint *)constraint //添加单个约束

- (void)addConstraints:(NSArray<__kindof NSLayoutConstraint *> *)constraint //添加多个约束

代码实现Autolayout的注意这几点,要先禁止autoresizing功能,设置view的下面属性为NO,view.translatesAutoresizingMaskIntoConstraints = NO;it

添加约束以前,必定要保证相关控件都已经在各自的父控件上,不用再给view设置frame。io

一个NSLayoutConstraint对象就表明一个约束,建立约束的方法:

NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:(id)view1 attribute:(NSLayoutAttribute)attr1 relatedBy:(NSLayoutRelation)relation toItem:(id)view2 attribute:(NSLayoutAttribute)attr2 multiplier:(CGFloat)multiplier constant:(CGFloat)c];

view1 :要约束的控件

attr1 :约束的类型(作怎样的约束)

relation :与参照控件之间的关系

view2 :参照的控件

attr2 :约束的类型(作怎样的约束)

multiplier :乘数

c :常量


添加约束的规则

一、对于两个同层级view之间的约束关系,添加到它们的父view上。

二、对于两个不一样层级view之间的约束关系,添加到他们最近的共同父view上。

三、对于有层次关系的两个view之间的约束关系,添加到层次较高的父view上。


---------------------------------------------

另外苹果官方为了简化Autolayout的编码还推出了另外一种语言,vfl(visual format language可视化格式语言)

H:[cancelButton(50)]-10-[acceptButton(50)]  表示   canelButton宽50,acceptButton宽50,它们之间间距10

V:[redView][yellowView(==redView)]  表示  竖直方向上,先有一个redView,其下方紧接一个高度等于redView高度的yellowView

使用VFL来建立约束数组

+ (NSArray *)constraintsWithVisualFormat:(NSString *)format options:(NSLayoutFormatOptions)opts metrics:(NSDictionary *)metrics views:(NSDictionary *)views;

format :VFL语句

opts :约束类型

metrics :VFL语句中用到的具体数值

views :VFL语句中用到的控件

建立一个字典(内部包含VFL语句中用到的控件)的快捷宏定义 NSDictionaryOfVariableBindings(...)

// 间距
NSNumber *margin = @20;
    
// 这条vfl就是水平方向上,blueView左边距父控件最左边距20,redView距父控件最右边距20,blueView和redView中间距离20
NSString *vfl = @"H:|-margin-[blueView]-margin-[redView(==blueView)]-margin-|";
NSDictionary *views = NSDictionaryOfVariableBindings(blueView, redView);
NSDictionary *mertrics = NSDictionaryOfVariableBindings(margin);
NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:vfl options:NSLayoutFormatAlignAllTop | NSLayoutFormatAlignAllBottom metrics:mertrics views:views];
[self.view addConstraints:constraints];
相关文章
相关标签/搜索