自定义NSLayoutConstraint约束库
首先我们先看一下API给的约束方式。
假如有一个subView他的父视图为superView
NSLayoutConstraint * layoutConstraint = [NSLayoutConstraint
constraintWithItem:(subView的约束) attribute:(subView哪个约束) relatedBy:(约束关系(小于或等于 )(等于)(大于或等于)) toItem:(superView) attribute:(superView的哪个约束条件) multiplier:(向量系数(类似几倍于)) constant:(偏移量)];
layoutConstraint.identifier = identifier;//设置约束标识用于更新或删除约束
[superView addConstraint:subView];//添加到父视图中
也可以通过此种方式添加
[superView addConstraints:<#(nonnull NSArray<__kindof NSLayoutConstraint *> *)#>]
移除一组约束
[superView removeConstraint:identifier];
这样我们就可以得到一个约束条件,一般我们只需要4个不同的约束条件就可以确定一个subView在superView中的位置,这里就简单的介绍这些,因为这些足够我们使用了。
接下来我们开始自定义约束,咱们都是对一个view进行约束的,所以新建一个UIView的Category。
添加一个函数,该函数里调用系统Api的约束创建,并返回一个约束
/**
* 设置一个约束
@param myAttribute 约束我的那个条件
@param layoutRelation 约束关系
@param toView 依赖谁
@param toAttribute 依赖它的哪个条件
@param multiplier 向量系数
@param constant 偏移量
@return NSLayoutConstraint
*/
- (NSLayoutConstraint *)addConstraintmyWitthAttribute:(NSLayoutAttribute)myAttribute
LayoutRelation:(NSLayoutRelation)layoutRelation
ToView:(UIView * )toView
toLayoutAttribute:(NSLayoutAttribute)toAttribute
multiplier:(CGFloat)multiplier
constant:(CGFloat)constant
identifier:(NSString * )identifier{
//为了避免和系统生成的自动伸缩的约束不冲突 设置为NO
self.translatesAutoresizingMaskIntoConstraints = NO;
NSLayoutConstraint * layoutConstraint = [NSLayoutConstraint constraintWithItem:self
attribute:myAttribute
relatedBy:layoutRelation
toItem:toView
attribute:toAttribute
multiplier:multiplier
constant:constant];
layoutConstraint.identifier = identifier;//设置约束标识
return layoutConstraint;
}
/**
给View添加Top方向的约束,并依赖toView的Top方向约束
@param toView 依赖View
@param offset 偏移量
@param identifier 该约束的标识
@return NSLayoutConstraint * 使用addConstraint:函数添加约束
*/
- (NSLayoutConstraint *)addTopConstraintToViewTop:(UIView * )toView Offset:(CGFloat)offset identifier:(NSString * )identifier{
return [self addConstraintmyWitthAttribute:NSLayoutAttributeTop
LayoutRelation:NSLayoutRelationEqual
ToView:toView
toLayoutAttribute:NSLayoutAttributeTop
multiplier:1.0
constant:offset
identifier:identifier];
}
/**
* 给View添加Top方向的约束,并依赖toView的Bottom方向约束
@param toView 依赖View
@param offset 偏移量
@param identifier 该约束的标识
@return NSLayoutConstraint * 使用addConstraint:函数添加约束
*/
- (NSLayoutConstraint *)addTopConstraintToViewBottom:(UIView * )toView Offset:(CGFloat)offset identifier:(NSString * )identifier{
return [self addConstraintmyWitthAttribute:NSLayoutAttributeTop
LayoutRelation:NSLayoutRelationEqual
ToView:toView toLayoutAttribute:NSLayoutAttributeBottom
multiplier:1.0
constant:offset
identifier:identifier];
}
/**
* 给View添加left方向的约束,并依赖toView的left方向约束
@param toView 依赖View
@param offset 偏移量
@param identifier 该约束的标识
@return NSLayoutConstraint * 使用addConstraint:函数添加约束
*/
- (NSLayoutConstraint * )addLeftConstraintToViewLeft:(UIView * )toView Offset:(CGFloat)offset identifier:(NSString * )identifier{
return [self addConstraintmyWitthAttribute:NSLayoutAttributeLeft
LayoutRelation:NSLayoutRelationEqual
ToView:toView
toLayoutAttribute:NSLayoutAttributeLeft
multiplier:1.0
constant:offset
identifier:identifier];
}
/**
* 给View添加left方向的约束,并依赖toView的Right方向约束
@param toView 依赖View
@param offset 偏移量
@param identifier 该约束的标识
@return NSLayoutConstraint * 使用addConstraint:函数添加约束
*/
- (NSLayoutConstraint * )addLeftConstraintToViewRight:(UIView * )toView Offset:(CGFloat)offset identifier:(NSString * )identifier{
return [self addConstraintmyWitthAttribute:NSLayoutAttributeLeft
LayoutRelation:NSLayoutRelationEqual
ToView:toView
toLayoutAttribute:NSLayoutAttributeRight
multiplier:1.0
constant:offset
identifier:identifier];
}
/**
* 给View添加Bottom方向的约束,并依赖toView的Bottom方向约束
@param toView 依赖View
@param offset 偏移量
@param identifier 该约束的标识
@return NSLayoutConstraint * 使用addConstraint:函数添加约束
*/
- (NSLayoutConstraint *)addBottomConstraintToViewBottom:(UIView * )toView Offset:(CGFloat)offset identifier:(NSString * )identifier{
return [self addConstraintmyWitthAttribute:NSLayoutAttributeBottom
LayoutRelation:NSLayoutRelationEqual
ToView:toView
toLayoutAttribute:NSLayoutAttributeBottom
multiplier:1.0
constant:offset
identifier:identifier];
}
/**
给View添加Bottom方向的约束,并依赖toView的Top方向约束
@param toView 依赖View
@param offset 偏移量
@param identifier 该约束的标识
@return NSLayoutConstraint * 使用addConstraint:函数添加约束
*/
- (NSLayoutConstraint *)addBottomConstraintToViewTop:(UIView * )toView Offset:(CGFloat)offset identifier:(NSString * )identifier{
return [self addConstraintmyWitthAttribute:NSLayoutAttributeBottom
LayoutRelation:NSLayoutRelationEqual
ToView:toView
toLayoutAttribute:NSLayoutAttributeTop
multiplier:1.0
constant:offset
identifier:identifier];
}
/**
给View添加Right方向的约束,并依赖toView的Right方向约束
@param toView 依赖View
@param offset 偏移量
@param identifier 该约束的标识
@return NSLayoutConstraint * 使用addConstraint:函数添加约束
*/
- (NSLayoutConstraint *)addRightConstraintToViewRight:(UIView * )toView Offset:(CGFloat)offset identifier:(NSString * )identifier
{
return [self addConstraintmyWitthAttribute:NSLayoutAttributeRight
LayoutRelation:NSLayoutRelationEqual
ToView:toView
toLayoutAttribute:NSLayoutAttributeRight
multiplier:1.0
constant:offset
identifier:identifier];
}
/**
* 给View添加Right方向的约束,并依赖toView的Left方向约束
@param toView 依赖View
@param offset 偏移量
@return NSLayoutConstraint * 使用addConstraint:函数添加约束
*/
- (NSLayoutConstraint *)addRightConstraintToViewLeft:(UIView * )toView Offset:(CGFloat)offset identifier:(NSString * )identifier
{
return [self addConstraintmyWitthAttribute:NSLayoutAttributeRight
LayoutRelation:NSLayoutRelationEqual
ToView:toView
toLayoutAttribute:NSLayoutAttributeLeft
multiplier:1.0
constant:offset
identifier:identifier];
}
剩下的对宽高等约束再自行添加吧,接下来说如何删除一个约束
//加YR 避免重写系统的函数
- (void)removeConstraintYR:(NSString * )identifier{
for (NSLayoutConstraint * obj in self.superview.constraints) {
//找到对应要删除的约束
if ([obj.identifier isEqualToString:identifier]) {
//从父视图中删除
[self.superview removeConstraint:obj];
}
}
}
“`
约束关系
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,
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
};
“`gitHub地址: https://github.com/HMWDavid/YRLayoutConstraint
cocoaPods: pod ‘YRLayoutConstraint’ , ‘~>1.0.5’
这个是本人写的不是很全,还可以优化的地方,可以借鉴一下http://download.csdn.net/detail/luck_developer/9875161