使用NSLayoutConstraint添加约束线

参考链接:
http://www.jianshu.com/p/a4812b01a2a3

//view1可以待布局元件也可以为参考元件
    //view2可以参考元件也可以为待布局元件
    //事件函数计算公式:
    //view1.attr1 <relation> view2.attr2 * multiplier + constant

    //view1:约束线左(上)边端的元件(左(上)元件1)
    //attr1:指定view1约束线相关的轴线属性attr1(左(上)元件1的轴线属性attr1)

    //relation:view1元件/view2元件相应轴线属性的关系(位置方面关系)

    //view2:约束线右(下)边端的元件(右(下)元件2)
    //attr2:指定view2约束线相关的轴线属性attr2(右(下)元件2的轴线属性attr2)
    //multiplier:乘数因子(相对右(下)元件view2的长度方面属性涉及到的乘数因子multiplier)(尺寸方面乘数因子)
    //c:相对右(下)元件view2的属性进行叠加的浮点常数据constant(移位效果)
    //注意:如果相关的约束线不需要右(下)view2元件,则将view2参数设为nil,attr2参数设为NSLayoutAttributeNotAnAttribute

+ (instancetype)constraintWithItem:(id)view1 attribute:(NSLayoutAttribute)attr1 relatedBy:(NSLayoutRelation)relation toItem:(nullable id)view2 attribute:(NSLayoutAttribute)attr2 multiplier:(CGFloat)multiplier constant:(CGFloat)c API_AVAILABLE(macos(10.7), ios(6.0), tvos(9.0));

附视图的属性和关系的值:
typedef NS_ENUM(NSInteger, NSLayoutRelation) {
NSLayoutRelationLessThanOrEqual = -1,
NSLayoutRelationEqual = 0,
NSLayoutRelationGreaterThanOrEqual = 1,
};

typedef NS_ENUM(NSInteger, NSLayoutAttribute) {
NSLayoutAttributeLeft = 1,
NSLayoutAttributeRight,
NSLayoutAttributeTop,
NSLayoutAttributeBottom,
NSLayoutAttributeLeading,
NSLayoutAttributeTrailing,
NSLayoutAttributeWidth,
NSLayoutAttributeHeight,
NSLayoutAttributeCenterX,
NSLayoutAttributeCenterY,
NSLayoutAttributeLastBaseline,
#if TARGET_OS_IPHONE
NSLayoutAttributeBaseline NS_SWIFT_UNAVAILABLE(“Use ‘lastBaseline’ instead”) = NSLayoutAttributeLastBaseline,
#else
NSLayoutAttributeBaseline = NSLayoutAttributeLastBaseline,
#endif
NSLayoutAttributeFirstBaseline API_AVAILABLE(macos(10.11), ios(8.0)),

#if TARGET_OS_IPHONE
NSLayoutAttributeLeftMargin API_AVAILABLE(ios(8.0)),
NSLayoutAttributeRightMargin API_AVAILABLE(ios(8.0)),
NSLayoutAttributeTopMargin API_AVAILABLE(ios(8.0)),
NSLayoutAttributeBottomMargin API_AVAILABLE(ios(8.0)),
NSLayoutAttributeLeadingMargin API_AVAILABLE(ios(8.0)),
NSLayoutAttributeTrailingMargin API_AVAILABLE(ios(8.0)),
NSLayoutAttributeCenterXWithinMargins API_AVAILABLE(ios(8.0)),
NSLayoutAttributeCenterYWithinMargins API_AVAILABLE(ios(8.0)),
#endif

NSLayoutAttributeNotAnAttribute = 0

};
备注:
NSLayoutAttributeLeft/NSLayoutAttributeRight
和NSLayoutAttributeLeading/NSLayoutAttributeTrailing
的区别是left/right永远是指左右,而leading/trailing在某些从右至左习惯的地区会变成,leading是右边,trailing是左边。

使用Autolayout时必须将TranslatesAutoresizingMaskIntoConstraints属性设置为NO(禁用AutoresizingMask)

PS备注:

(关键点1+关键点2+关键点3)==(XIB画布中1条拖线)

//关键点1
    //待布局元件(禁用AutoresizingMask(约束线(指令)生效))
    [self.threeBtn setTranslatesAutoresizingMaskIntoConstraints:NO];

    //关键点2
    NSLayoutConstraint *leftConstraint;
    //构建约束线(指令)
    leftConstraint = [NSLayoutConstraint constraintWithItem:self.view attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:self.threeBtn attribute:NSLayoutAttributeLeft multiplier:1 constant:-15];
    //关键点3
    //已存在的约束线(指令)绑定视图(有效化)
    [self.view addConstraint:leftConstraint];

//view1.attr1 <relation> view2.attr2 * multiplier + constant

猜你喜欢

转载自blog.csdn.net/yanhaijunyan/article/details/114023273