orangeView}]; [self.view addConstraints:conV]; //设置blueView水平方向约束 NSArray *conH2 = [NSLayoutConstraint 0 metrics:nil views:@{@"view1":blueView}]; [orangeView addConstraints:conV2]; //设置宽高约束 NSLayoutConstraint *conWidth = [NSLayoutConstraint constraintWithItem:blueView attribute:NSLayoutAttributeWidth relatedBy *conHeight = [NSLayoutConstraint constraintWithItem:blueView attribute:NSLayoutAttributeHeight relatedBy 类方法 + (NSArray<__kindof NSLayoutConstraint *> *)constraintsWithVisualFormat:(NSString *)format options
ContentView的布局为: NSLayoutConstraint *top = [NSLayoutConstraint constraintWithItem:contentView attribute *left = [NSLayoutConstraint constraintWithItem:contentView attribute:NSLayoutAttributeLeft relatedBy *right = [NSLayoutConstraint constraintWithItem:contentView attribute:NSLayoutAttributeRight relatedBy constraintEqualToConstant:44]; [NSLayoutConstraint activateConstraints:@[left, right, bottom, height 比如原生代码调用: NSLayoutConstraint *top = [NSLayoutConstraint constraintWithItem:contentView attribute:NSLayoutAttributeTop
&& view.superview) { if (self.position == SXBarViewPositionLeft) { for (NSLayoutConstraint constraint]; } } [view.superview addConstraint:[NSLayoutConstraint self.applied = YES; } else if (self.position == SXBarViewPositionRight) { for (NSLayoutConstraint constraint]; } } [view.superview addConstraint:[NSLayoutConstraint
setTranslatesAutoresizingMaskIntoConstraints(false) //设置在约束布局系统中是否把自动布局转换为约束布局 self.view.addSubview(v1) 然后添加约束 self.view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat NSTextAlignment.Center v3.text = "v3" self.view.addSubview(v3) self.view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat DirectionLeadingToTrailing, metrics: nil, views: ["v1":v1])) self.view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat , metrics: nil, views: ["v2":v2,"v3":v3])) self.view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat metrics: nil, views: ["v1":v1, "v2":v2,"v3":v3])) self.view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat
:(NSArray<__kindof NSLayoutConstraint *> *)constraints - (void)removeConstraint:(NSLayoutConstraint * )constraint - (void)removeConstraints:(NSArray<__kindof NSLayoutConstraint *> *)constraints 注意: 1.先禁止 *xConstraint = [NSLayoutConstraint constraintWithItem:redView attribute:NSLayoutAttributeLeft relatedBy *yConstraint = [NSLayoutConstraint constraintWithItem:redView attribute:NSLayoutAttributeTop relatedBy *heightConstraint = [NSLayoutConstraint constraintWithItem:redView attribute:NSLayoutAttributeHeight
创建NSLayoutConstraint对象的方法有两种,下面我们分别介绍: 1、使用Objective-C风格的方法创建约束对象 所谓Objective-C风格的方法,就是通过原生枚举和一些属性设置来创建 NSLayoutConstraint对象。 使用NSLayoutConstraint类的如下方法: +(instancetype)constraintWithItem:(id)view1 attribute:(NSLayoutAttribute) * constraintw = [NSLayoutConstraint constraintWithItem:label attribute:NSLayoutAttributeWidth relatedBy 相对于NSLayoutConstraint中的创建方法如下: + (NSArray<__kindof NSLayoutConstraint *> *)constraintsWithVisualFormat
//创建左边约束 NSLayoutConstraint *leftLc = [NSLayoutConstraint constraintWithItem:blueView attribute:NSLayoutAttributeLeft *leftLc = [NSLayoutConstraint constraintWithItem:blueView attribute:NSLayoutAttributeLeft relatedBy: *rightLc = [NSLayoutConstraint constraintWithItem:blueView attribute:NSLayoutAttributeRight relatedBy MASLayoutConstraint就是NSLayoutConstraint的子类,只是添加了mas_key属性。 到这里,我们就与系统提供的API对应上了。 NSLayoutConstraint *leftLc = [NSLayoutConstraint constraintWithItem:blueView attribute:NSLayoutAttributeLeft
; //水平约束 NSString *vfl1 = @"H:|-50-[blueView(width)]-30-[redView(width)]"; NSArray *constraints1 = [NSLayoutConstraint addConstraints:constraints1]; //垂直约束 NSString *vfl2 = @"V:|-100-[blueView(height)]"; NSArray *constraints2 = [NSLayoutConstraint -30-|"; NSDictionary *views = @{@"blueView":blueView}; //metrics参数中做好对应关系 NSArray *constraints1 = [NSLayoutConstraint :constraints1]; NSString *vfl2 = @"V:|-30-[blueView(height)]-30-|"; NSArray *constraints2 = [NSLayoutConstraint addConstraints:constraints1]; NSString *vfl2 = @"V:|-30-[blueView(height)]-30-|"; NSArray *constraints2 = [NSLayoutConstraint
baiduMap); self.mapView.addConstraints(self.layoutConstraints()) } func layoutConstraints() -> [NSLayoutConstraint ]{ let views = ["map": self.baiduMap ] let metrics = ["margin": 0] var result = NSLayoutConstraint.constraintsWithVisualFormat margin)-|", options:NSLayoutFormatOptions.AlignAllTop, metrics: metrics, views: views) result += NSLayoutConstraint.constraintsWithVisualFormat
比如 只约束了宽度和高度, 没有约束具体的位置 两个约束冲突, 比如 1个约束控件的宽度为100, 1个约束控件的宽度为110 代码实现Autolayout 代码实现Autolayout的步骤 利用NSLayoutConstraint 类创建具体的约束对象 添加约束对象到相应的view上 - (void)addConstraint:(NSLayoutConstraint *)constraint; - (void)addConstraints NO view.translatesAutoresizingMaskIntoConstraints = NO; 添加约束之前,一定要保证相关控件都已经在各自的父控件上 不用再给view设置frame NSLayoutConstraint 一个NSLayoutConstraint对象就代表一个约束 创建约束对象的常用方法 /* view1 :要约束的控件 attr1 :约束的类型(做怎样的约束) relation :与参照控件之间的关系
( "<NSLayoutConstraint:0x156734e0 UILabel:0x1568b9f0.width == UIView:0x155d9110.width - 32>", "<NSLayoutConstraint:0x1568db80 UIView:0x155d9110.width == UIView:0x155d8fc0.width>", "<NSLayoutConstraint :0x156913b0 H:[UIView:0x155d8fc0(30)]>" ) Will attempt to recover by breaking constraint <NSLayoutConstraint
floatValue*[[UIScreen mainScreen] bounds].size.width/kDesignWidth) #endif 约束适配 利用IBInspectable关键字和分类 1.写一个NSLayoutConstraint adapterScreen的属性(Bool 值,yes代表需要对屏幕进行等比例适配) #import <UIKit/UIKit.h> NS_ASSUME_NONNULL_BEGIN @interface NSLayoutConstraint nonatomic, assign) IBInspectable BOOL adapterScreen; @end NS_ASSUME_NONNULL_END 2.在adapterScreen的set方法里面对NSLayoutConstraint 对象的constant值进行换算 #import "NSLayoutConstraint+XibScale.h" #import <objc/runtime.h> #import "FitScaleHelper.h " //定义常量 static char *AdapterScreenKey = "AdapterScreenKey"; @implementation NSLayoutConstraint (XibScale
( "<NSLayoutConstraint:0x6000033a5810 UILabel:0x7f898d0072c0.height == 21 (active)>", "<NSLayoutConstraint :0x6000033a59f0 UILabel:0x7f898d016da0.height >= 20.5 (active)>", "<NSLayoutConstraint:0x6000033df2a0 [UILabel:0x7f898d0072c0] (active, names: '|':UITableViewCellContentView:0x7f898d0061f0 )>", "<NSLayoutConstraint 0x6000033df340 V:[UILabel:0x7f898d0072c0]-(NSSpace(8))-[UILabel:0x7f898d016da0] (active)>", "<NSLayoutConstraint :0x7f898d016da0]-(>=9)-| (active, names: '|':UITableViewCellContentView:0x7f898d0061f0 )>", "<NSLayoutConstraint
multiplier constant:(CGFloat)constant; Button.centerX = Superview.centerX // => [NSLayoutConstraint multiplier:1.0 constant:0.0]; Button.bottom = Superview.bottom - <padding> // => [NSLayoutConstraint
( "<NSLayoutConstraint:0x6000033a5810 UILabel:0x7f898d0072c0.height == 21 (active)>", "<NSLayoutConstraint :0x6000033a59f0 UILabel:0x7f898d016da0.height >= 20.5 (active)>", "<NSLayoutConstraint:0x6000033df2a0 [UILabel:0x7f898d0072c0] (active, names: '|':UITableViewCellContentView:0x7f898d0061f0 )>", "<NSLayoutConstraint 0x6000033df340 V:[UILabel:0x7f898d0072c0]-(NSSpace(8))-[UILabel:0x7f898d016da0] (active)>", "<NSLayoutConstraint :0x7f898d016da0]-(>=9)-| (active, names: '|':UITableViewCellContentView:0x7f898d0061f0 )>", "<NSLayoutConstraint
Masonry简化了NSLayoutConstraint的使用方式,让我们可以以链式的方式为我们的控件指定约束。 一、Masonry框架与NSLayoutConstraint调用方式的对比 首先我们NSLayoutConstraint为我们的View添加一个约束,然后再给出Masonry的代码。 MASConstraintMaker之所以成为约束工厂类,因为MASConstraintMaker赋值创建NSLayoutConstraint对象,因为Masonry将NSLayoutConstraint 下方代码就是install中根据MASViewConstraint所收集的参数来创建NSLayoutConstraint对象,下方的MASLayoutConstraint其实就是NSLayoutConstraint 下方就是调用系统的NSLayoutConstraint为创建相应的约束对象,下方的构造器与第一部分中的NSLayoutConstraint一致。 ?
margin = 4.0f; } [view.superview addConstraint:[NSLayoutConstraint margin = -4.0f; } [view.superview addConstraint:[NSLayoutConstraint *leadingConstraint = [NSLayoutConstraint constraintWithItem:view attribute:NSLayoutAttributeLeading margin = -kAppAdaptHeight(15); //删除原来的leading约束 for (NSLayoutConstraint *trailingConstraint = [NSLayoutConstraint constraintWithItem:view attribute:NSLayoutAttributeTrailing
margin = 4.0f; } [view.superview addConstraint:[NSLayoutConstraint margin = -4.0f; } [view.superview addConstraint:[NSLayoutConstraint *leadingConstraint = [NSLayoutConstraint constraintWithItem:view attribute:NSLayoutAttributeLeading margin = -kAppAdaptHeight(15); //删除原来的leading约束 for (NSLayoutConstraint *trailingConstraint = [NSLayoutConstraint constraintWithItem:view attribute:NSLayoutAttributeTrailing
//创建左边约束 NSLayoutConstraint *leftLc = [NSLayoutConstraint constraintWithItem:blueView attribute:NSLayoutAttributeLeft *leftLc = [NSLayoutConstraint constraintWithItem:blueView attribute:NSLayoutAttributeLeft relatedBy: *rightLc = [NSLayoutConstraint constraintWithItem:blueView attribute:NSLayoutAttributeRight relatedBy MASLayoutConstraint就是NSLayoutConstraint的子类,只是添加了mas_key属性。到这里,我们就与系统提供的API对应上了。 NSLayoutConstraint *leftLc = [NSLayoutConstraint constraintWithItem:blueView attribute:NSLayoutAttributeLeft
. - (void) addConstraint: (NSLayoutConstraint *) constraint NS_AVAILABLE_IOS (6_0); 2. - (void 就是上面所加入到NSDictionary中的绑定的View; 在这里要注意的是AddConstraints 和AddConstraint之间的区别,一个添加的参数是NSArray,一个是NSLayoutConstraint NO; [self.view addSubview: v2]; //添加两个允许自动布局的子视图 //设置子视图的宽度和父视图的宽度相同 [self.view addConstraint: [NSLayoutConstraint |-0-[v1][v2(==v1)]|"options:0 metrics:nil views:views]]; //最后是垂直布局两个子view [self.viewaddConstraints:[NSLayoutConstraint 2.2 AutoLayout框架介绍(ZXPAutoLayout) iOS原生的自动布局(NSLayoutConstraint)非常繁琐, 影响开发进度和可读性也不利于维护, 正所谓工欲善其事必先利其器