自定义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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值