源码

iOS使用代码进行AutoLayout自动布局

1.简介

  • 1.在以前的iOS代码中是如何设置布局UI界面的?
    经常编写大量的坐标计算代码,为了保证在3.5 inch和4.0 inch屏幕上都能有完美的UI界面效果,有时还需要分别为2种屏幕编写不同的坐标计算代码(即传说中的“屏幕适配”)。

  • 2.什么是AutoLayout?
    AutoLayout是一种自动布局技术,专门用来布局UI界面。AutoLayout自iOS6开始引入,由于xcode4的不给力,当时并没有得到很大的推广。自iOS7开始,AutoLayout的开发效率得到很大的提升,苹果官方也推荐开发者尽量使用AutoLayout来进行UI布局。AutoLayout能够很轻松的解决屏幕适配的问题。

  • 3.Autoresizing
    在AutoLayout之前,有Autoresizing可以做屏幕适配,但是它局限性较大,很多工作无法完成,相比之下,AutoLayout的功能比Autoresizing强大得多。

2.代码实现AutoLayout

代码实现AutoLayout要注意的点:
1.要先禁止视图的autoresizing功能,视图的下列属性设置为NO:
view.translatesAutoresizingMaskIntoConstraints = NO;
2.添加约束之前,一定保证相关控件都已经添加到各自的父视图上。
3.不再需要为视图设置frame。

代码实现AutoLayout的步骤如下:
1.创建一个NSLayoutConstraint类的实例对象作为具体的约束对象。
1.将这个具体的约束对象添加到对应的视图上去。

1.创建一个NSLayoutConstraint类的实例对象作为具体的约束对象

NSLayoutConstraint类创建具体的约束对象有两种方法:

+ (instancetype)constraintWithItem:(id)view1 attribute:(NSLayoutAttribute)attr1 relatedBy:(NSLayoutRelation)relation toItem:(id)view2 attribute:(NSLayoutAttribute)attr2 multiplier:(CGFloat)multiplier constant:(CGFloat)c;

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

我们先来看第一种方法,第二种方法我们在后面再讲。

+ (instancetype)constraintWithItem:(id)view1 attribute:(NSLayoutAttribute)attr1 relatedBy:(NSLayoutRelation)relation toItem:(id)view2 attribute:(NSLayoutAttribute)attr2 multiplier:(CGFloat)multiplier constant:(CGFloat)c;

这个方法创建了一个约束对象,这个约束对象定义了View1的attribute1属性和View2的attribute2属性之间的关系。他们之间有这样的一个线性等式的关系:
item1.attribute1 = multiplier × item2.attribute2 + constant

  • view1
    就是约束左边的视图,也就是上面核心等式中的item1

  • attr1
    上面核心等式左边的视图的属性,它是NSLayoutAttribute的枚举类型。
    NSLayoutAttribute:

typedef NS_ENUM(NSInteger, NSLayoutAttribute) {    NSLayoutAttributeLeft = 1,    NSLayoutAttributeRight,    NSLayoutAttributeTop,    NSLayoutAttributeBottom,    NSLayoutAttributeLeading,    NSLayoutAttributeTrailing,    NSLayoutAttributeWidth,    NSLayoutAttributeHeight,    NSLayoutAttributeCenterX,    NSLayoutAttributeCenterY,    NSLayoutAttributeLastBaseline,    NSLayoutAttributeBaseline NS_SWIFT_UNAVAILABLE("Use 'lastBaseline' instead") = NSLayoutAttributeLastBaseline,    NSLayoutAttributeFirstBaseline NS_ENUM_AVAILABLE_IOS(8_0),    
    
    NSLayoutAttributeLeftMargin NS_ENUM_AVAILABLE_IOS(8_0),    NSLayoutAttributeRightMargin NS_ENUM_AVAILABLE_IOS(8_0),    NSLayoutAttributeTopMargin NS_ENUM_AVAILABLE_IOS(8_0),    NSLayoutAttributeBottomMargin NS_ENUM_AVAILABLE_IOS(8_0),    NSLayoutAttributeLeadingMargin NS_ENUM_AVAILABLE_IOS(8_0),    NSLayoutAttributeTrailingMargin NS_ENUM_AVAILABLE_IOS(8_0),    NSLayoutAttributeCenterXWithinMargins NS_ENUM_AVAILABLE_IOS(8_0),    NSLayoutAttributeCenterYWithinMargins NS_ENUM_AVAILABLE_IOS(8_0),    
    NSLayoutAttributeNotAnAttribute = 0};
  • relation
    relation指的是左边的约束和右边的约束之间的关系,左边和右边的云总共有三种关系,即=,>=,<=。所以relation也是一个枚举值:

typedef NS_ENUM(NSInteger, NSLayoutRelation) {    NSLayoutRelationLessThanOrEqual = -1,//=};
  • view2
    约束右边的视图

  • attr2
    约束右边的视图的属性,和attr1一样是枚举值。

  • multiplier
    这个就是上面的核心等式中的multiplier,就是乘的倍数。

  • c
    就是乘的倍数后面加上的一个常量

2.将这个具体的约束对象添加到对应的视图上去

在添加约束后,要将它作用到对应的view上。
在添加到view上时要遵循以下规则:

  • 1.对于两个同层级View之间的约束关系,添加到它们的父视图上。

(0)

本文由 投稿者 创作,文章地址:https://blog.isoyu.com/archives/iosshiyongdaimajinxingautolayoutzidongbuju.html
采用知识共享署名4.0 国际许可协议进行许可。除注明转载/出处外,均为本站原创或翻译,转载前请务必署名。最后编辑时间为:2 月 22, 2019 at 04:54 下午

热评文章

发表回复

[必填]

我是人?

提交后请等待三秒以免造成未提交成功和重复