iOS开发自动布局代码篇NSLayoutConstraint

一.介绍

NSLayoutConstraint是iOS6之后出来的类

使用AutoLayout之前需要知道以下两点:

1.必须设置translatesAutoresizingMaskIntoConstraints为NO

2.如果是viewController则AutoLayout适配写在:

- (void)updateViewConstraints NS_AVAILABLE_IOS(6_0);

如果是view则AutoLayout适配写在:

- (void)updateConstraints NS_AVAILABLE_IOS(6_0) NS_REQUIRES_SUPER;

二.创建方法

NSLayoutConstraint中有两个方法:

第一个方法:

/* Create constraints explicitly.  Constraints are of the form "view1.attr1 = view2.attr2 * multiplier + constant" 
 If your equation does not have a second view and attribute, use nil and NSLayoutAttributeNotAnAttribute.
 */
+(instancetype)constraintWithItem:(id)view1 attribute:(NSLayoutAttribute)attr1 relatedBy:(NSLayoutRelation)relation toItem:(nullable id)view2 attribute:(NSLayoutAttribute)attr2 multiplier:(CGFloat)multiplier constant:(CGFloat)c;

参数说明:

第一个参数view1:要设置的视图

第二个参数attr1:是个枚举,表示view1要设置的属性

第三个参数relation:是个枚举,表示视图view1和view2的指定属性之间的关系

第四个参数view2:参照的视图,可以为空

第五个参数attr2:是个枚举,表示view2的属性

第六个参数multipler:视图view1的指定属性是参照视图view2指定属性的多少倍

第七个参数c:视图view1的指定属性需要加的浮点数

根据参数的讲解,得出计算公式如下

view1.attr1 [=,>=,<=] view2.attr2 * multipler + c;

参数详情:

1.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
};

NSLayoutAttributeLeft:视图的左边

NSLayoutAttributeRight:视图的右边

NSLayoutAttributeTop:视图的上边

NSLayoutAttributeBottom:视图的底边

NSLayoutAttributeLeading:在习惯有左向右看的地区,相当于NSLayoutAttributeLeft;在习惯有右向左看的地区,相当于NSLayoutAttributeRight

NSLayoutAttributeTrailing:在习惯有左向右看的地区,相当于NSLayoutAttributeRight;在习惯有右向左看的地区,相当于NSLayoutAttributeLeft

NSLayoutAttributeWidth:视图的宽度

NSLayoutAttributeHeight:视图的高度

NSLayoutAttributeCenterX:视图的中心x轴

NSLayoutAttributeCenterY:视图的中心y轴

NSLayoutAttributeLastBaseline:相当于NSLayoutAttributeBaseline

NSLayoutAttributeBaseline:文本底标线,在大多数视图中等同于NSLayoutAttributeBottom;在少数视图,如UILabel,是指字母的底部出现的位置

NSLayoutAttributeLastFirstline:文本上标线,在大多数视图中等同于NSLayoutAttributeTop;在少数视图,如UILabel,是指字母的上部出现的位置

NSLayoutAttributeNotAnAttribute:没有

2.NSLayoutRelation 是个枚举

typedef NS_ENUM(NSInteger, NSLayoutRelation) {
    NSLayoutRelationLessThanOrEqual = -1,
    NSLayoutRelationEqual = 0,
    NSLayoutRelationGreaterThanOrEqual = 1,
};

NSLayoutRelationLessThanOrEqual:表示小于等于<=

NSLayoutRelationEqual:表示等于=

NSLayoutRelationGreaterThanOrEqual:表示大于等于>=

第二个方法VFL(Visual format language):

/* Create an array of constraints using an ASCII art-like visual format string.
 */
+ (NSArray<__kindof NSLayoutConstraint *> *)constraintsWithVisualFormat:(NSString *)format options:(NSLayoutFormatOptions)opts metrics:(nullable NSDictionary<NSString *,id> *)metrics views:(NSDictionary<NSString *, id> *)views;

参数说明:

format:视图约束的格式规范

opts:是个可选类型,表示视图的属性和布局方向

metrics:是个字典,在可视格式字符串(format)中出现的字段,必须在字典的key中找到,没找到,app就会crash

views:视图字典,这里传所有你要约束的view,NSDictionaryOfVariableBindings(view1, view2)

参数详情:

VFL语言的规则:

1."H" 表示水平方向,"V" 表示垂直方向

2."|" 表示SuperView

3."-" 表示一个间距空间,这个间距如果是view和SuperView之间,比如@"|-[button]"就是20px,如果是两个同级别的view,比如@"[button]-[button2]",那就是8px

   @"V:|-100-[button]"  表示按钮距离父视图头部100px @"V:|-100-[button]-50-|"  表示按钮距离父视图头部100px 按钮距离父视图底部50px

4."[]" 表示view,"()" 表示尺寸,可以有多个条件组合,比如@"[button(>=70,<=100)]'

5."@"表示优先级,比如@"[button(==30@1000)]"

三.添加方法

1.获取当前view中所有NSLayoutAttribute

@property(nonatomic,readonly) NSArray<__kindof NSLayoutConstraint *> *constraints NS_AVAILABLE_IOS(6_0);

2.添加NSLayoutAttribute到view或者移除NSLayoutAttribute

- (void)addConstraint:(NSLayoutConstraint *)constraint NS_AVAILABLE_IOS(6_0); // This method will be deprecated in a future release and should be avoided.  Instead, set NSLayoutConstraint's active property to YES.
- (void)addConstraints:(NSArray<__kindof NSLayoutConstraint *> *)constraints NS_AVAILABLE_IOS(6_0); // This method will be deprecated in a future release and should be avoided.  Instead use +[NSLayoutConstraint activateConstraints:].
- (void)removeConstraint:(NSLayoutConstraint *)constraint NS_AVAILABLE_IOS(6_0); // This method will be deprecated in a future release and should be avoided.  Instead set NSLayoutConstraint's active property to NO.
- (void)removeConstraints:(NSArray<__kindof NSLayoutConstraint *> *)constraints NS_AVAILABLE_IOS(6_0); // This method will be deprecated in a future release and should be avoided.  Instead use +[NSLayoutConstraint deactivateConstraints:].

3.iOS8新加方法,激活或者停止置顶约束

/* The receiver may be activated or deactivated by manipulating this property.  Only active constraints affect the calculated layout.  Attempting to activate a constraint whose items have no common ancestor will cause an exception to be thrown.  Defaults to NO for newly created constraints. */
@property (getter=isActive) BOOL active NS_AVAILABLE(10_10, 8_0);

/* Convenience method that activates each constraint in the contained array, in the same manner as setting active=YES. This is often more efficient than activating each constraint individually. */
+ (void)activateConstraints:(NSArray<NSLayoutConstraint *> *)constraints NS_AVAILABLE(10_10, 8_0);

/* Convenience method that deactivates each constraint in the contained array, in the same manner as setting active=NO. This is often more efficient than deactivating each constraint individually. */
+ (void)deactivateConstraints:(NSArray<NSLayoutConstraint *> *)constraints NS_AVAILABLE(10_10, 8_0);

四.代码

1.设置视图view1的宽度和高度为100

[self addConstraint:[NSLayoutConstraint constraintWithItem:view1 attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0 constant:100.0]];
[self addConstraint:[NSLayoutConstraint constraintWithItem:view1 attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0 constant:100.0]];

2. 添加到view上

NSLayoutConstraint *leadingConstraint = [NSLayoutConstraint constraintWithItem:view1 attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:view2 attribute:NSLayoutAttributeLeading multiplier:1.0 constant:0.0];
//旧版方法
//[self addConstraint:leadingConstraint];
//新版方法1
[NSLayoutConstraint activateConstraints:@[leadingConstraint]]; 
//新版方法2
leadingConstraint.active = YES;

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页