欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

自定义NSLayoutConstraint约束库

程序员文章站 2022-06-01 17:42:26
...

首先我们先看一下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

相关标签: 约束

上一篇: SQL基础—约束

下一篇: 数据库约束