ios

之前用的storyboard以及xib挺多的,最近看到朋友用第三方框架---自动布局约束框架在添加控件约束的时候老实报错.后来自己就试了试纯代码创建以及约束控件.但是纯代码约束一个控件还可以,如果约束的控件两个以上就不如用框架好使了,因为代码量太大了.所以自己简单地写了一下这方面的框架,功能还不完善,今天就花了三个小时写了一下: 实现的功能就是: 调用工具类的方法能实现一个视图在父视图superview中的约束. 以及 一个视图相对于 父视图superview 以及 SubView 两个视图的约束. 剩下的功能最近有时间就会完善


//
//  PBAutolayoutTools.h
//  testAutolayoutAddAndDelete
//
//  Created by 裴波波 on 16/4/29.
//  Copyright © 2016年 裴波波. All rights reserved.
//

#import <UIKit/UIKit.h>

/** 相对于子视图的约束 */
typedef enum : NSUInteger{
    PBTop = 1,
    PBLeft = 2,
    PBBottom = 3,
    PBRight = 4,
}SubOptions;


@interface PBAutolayoutTools : NSObject



/** 上,左,下,右,相对于父视图superView的约束 */
-(void)constrainCustomerView:(UIView *)customeView toSuperView:(UIView *)superView withTopContrain:(CGFloat)top withLeftConstrain:(CGFloat)left withBottomConstrain:(CGFloat)bottom withRigthConstrain:(CGFloat)right;


/** 
 1. customerView相对于父视图Superview以及一个子视图的Subview的约束
 2. option选择的是customerView相对于SubView的约束方向,例如customerView在SubView的下方50.0出 就是PBTop 然后 top = 50.0 即可,意思就是customerView的顶部(PBTop)距离SubView的底部. 
 2.1 PBTop --- customerView的顶部距离SubView的底部距离(customerView在下,SubView在上)
 3. PBLeft---customerView的左边与SubView的右边的距离 (customerView在右,SubView在左)
 4. PBBottom---就是customerView的底部距离SubView的顶部 (customerView在上,SubView在下)
 5. PBRight --- 就是customerView的右边 与 SubView的左边的距离 (customerView在左,SubView在右)
 */
-(void)constrainCustomerView:(UIView *)customeView toSuperView:(UIView *)superView andToASubView:(UIView *)subView withSubViewDirectionOption:(SubOptions)option withTopContrain:(CGFloat)top withLeftConstrain:(CGFloat)left withBottomConstrain:(CGFloat)bottom withRigthConstrain:(CGFloat)right;

/** 单例工具对象 */
+(PBAutolayoutTools *)sharedLayoutTools;



@end



下面看.m文件的代码


//
//  PBAutolayoutTools.m
//  testAutolayoutAddAndDelete
//
//  Created by 裴波波 on 16/4/29.
//  Copyright © 2016年 裴波波. All rights reserved.
//

#import "PBAutolayoutTools.h"

@interface PBAutolayoutTools ()

@property (nonatomic, strong) NSMutableArray *arrayConstrains;


@end


@implementation PBAutolayoutTools


-(NSMutableArray *)arrayConstrains{

    if (_arrayConstrains == nil) {
        _arrayConstrains = [NSMutableArray array];
    }
    return _arrayConstrains;
}


#pragma mark - 单例
static PBAutolayoutTools * instance = nil;
+(PBAutolayoutTools *)sharedLayoutTools{

    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        instance = [[PBAutolayoutTools alloc] init];
    });
    return instance;
}



/** customerView相对于父视图Superview以及一个子视图的Subview的约束 */
-(void)constrainCustomerView:(UIView *)customeView toSuperView:(UIView *)superView andToASubView:(UIView *)subView withSubViewDirectionOption:(SubOptions)option withTopContrain:(CGFloat)top withLeftConstrain:(CGFloat)left withBottomConstrain:(CGFloat)bottom withRigthConstrain:(CGFloat)right{
    
    /** 相对于一个子视图的约束subView */
    CGFloat subConstrain = 0.0;
    NSLayoutConstraint * superConstrain1 = nil;
    NSLayoutConstraint * superConstrain2 = nil;
    NSLayoutConstraint * superConstrain3 = nil;
    
    //用switch来判断option选择的是子视图的那个方向与SubView的哪个方向的间距.当option == PBTop的时候也就是customerView的顶部与SubView的底部的距离.此时与superview的底部的距离就可以忽略了!!! 则只需要计算customerView与superview的除top外的其他的约束.以此类推
    switch (option) {
        case PBTop:
            subConstrain = top;
            /** 相对于父视图的约束 */
            superConstrain1 = [NSLayoutConstraint constraintWithItem:customeView attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:superView attribute:NSLayoutAttributeLeft multiplier:1.0 constant:left];
            
            superConstrain2 = [NSLayoutConstraint constraintWithItem:customeView attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:superView attribute:NSLayoutAttributeBottom multiplier:1.0 constant:-bottom];
            
            superConstrain3 = [NSLayoutConstraint constraintWithItem:customeView attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:superView attribute:NSLayoutAttributeRight multiplier:1.0 constant:-right];
            break;
        case PBLeft:
            subConstrain = left;
            /** 相对于父视图的约束 */
            superConstrain1 = [NSLayoutConstraint constraintWithItem:customeView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:superView attribute:NSLayoutAttributeTop multiplier:1.0 constant:top];
            superConstrain2 = [NSLayoutConstraint constraintWithItem:customeView attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:superView attribute:NSLayoutAttributeBottom multiplier:1.0 constant:-bottom];
            superConstrain3 = [NSLayoutConstraint constraintWithItem:customeView attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:superView attribute:NSLayoutAttributeRight multiplier:1.0 constant:-right];
            break;
        case PBBottom:
            subConstrain = bottom;
            /** 相对于父视图的约束 */
            superConstrain1 = [NSLayoutConstraint constraintWithItem:customeView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:superView attribute:NSLayoutAttributeTop multiplier:1.0 constant:top];
            superConstrain2 = [NSLayoutConstraint constraintWithItem:customeView attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:superView attribute:NSLayoutAttributeLeft multiplier:1.0 constant:left];
            superConstrain3 = [NSLayoutConstraint constraintWithItem:customeView attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:superView attribute:NSLayoutAttributeRight multiplier:1.0 constant:-right];
            break;
        case PBRight:
            subConstrain = right;
            /** 相对于父视图的约束 */
            superConstrain1 = [NSLayoutConstraint constraintWithItem:customeView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:superView attribute:NSLayoutAttributeTop multiplier:1.0 constant:top];
            superConstrain2 = [NSLayoutConstraint constraintWithItem:customeView attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:superView attribute:NSLayoutAttributeLeft multiplier:1.0 constant:left];
            superConstrain3 = [NSLayoutConstraint constraintWithItem:customeView attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:superView attribute:NSLayoutAttributeBottom multiplier:1.0 constant:-bottom];
            break;
        default:
            break;
    }
    NSLayoutConstraint * constrainSub = [self constrainCustomerView:customeView aboutAnotherSubView:subView withSubviewOption:option withConstrain:subConstrain];
    
    [superView addConstraints:@[superConstrain1,superConstrain2,superConstrain3,constrainSub]];
}


下面是customerView在一个方向(上 或 下 或 左 或 右) 与SubView的间距.返回值是一个约束,在上面方法中调用,并将约束添加到superview中


/** 单个视图单个方向上的约束 */
-(NSLayoutConstraint *)constrainCustomerView:(UIView *)customeView aboutAnotherSubView:(UIView *)subview withSubviewOption:(SubOptions)option withConstrain:(CGFloat)constrain{

    //判断要约束的customerView与subview是哪个方向上的约束
    NSLayoutConstraint * returnConstrain = nil;
    switch (option) {
        case PBTop:
            returnConstrain = [NSLayoutConstraint constraintWithItem:customeView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:subview attribute:NSLayoutAttributeBottom multiplier:1.0 constant:constrain];
            break;
        case PBLeft:
            returnConstrain = [NSLayoutConstraint constraintWithItem:customeView attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:subview attribute:NSLayoutAttributeRight multiplier:1.0 constant:constrain];
            break;
        case PBBottom:
            returnConstrain = [NSLayoutConstraint constraintWithItem:customeView attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:subview attribute:NSLayoutAttributeTop multiplier:1.0 constant:-constrain];
            break;
        case PBRight:
            returnConstrain = [NSLayoutConstraint constraintWithItem:customeView attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:subview attribute:NSLayoutAttributeLeft multiplier:1.0 constant:-constrain];
            break;
            
        default:
            break;
    }
    return returnConstrain;
}



下面的方法是控制器的view中只有一个子视图view的约束方法.比较简单


/** 相对于父视图superView */
-(void)constrainCustomerView:(UIView *)customeView toSuperView:(UIView *)superView withTopContrain:(CGFloat)top withLeftConstrain:(CGFloat)left withBottomConstrain:(CGFloat)bottom withRigthConstrain:(CGFloat)right{

    /** 上 左 下 右  */
    NSLayoutConstraint * constrainTop = [NSLayoutConstraint constraintWithItem:customeView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:superView attribute:NSLayoutAttributeTop multiplier:1.0 constant:top];

    NSLayoutConstraint * constrainLeft = [NSLayoutConstraint constraintWithItem:customeView attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:superView attribute:NSLayoutAttributeLeft multiplier:1.0 constant:left];
    
    NSLayoutConstraint * constrainBottom = [NSLayoutConstraint constraintWithItem:customeView attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:superView attribute:NSLayoutAttributeBottom multiplier:1.0 constant:-bottom];
    
    NSLayoutConstraint * constrainRigth = [NSLayoutConstraint constraintWithItem:customeView attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:superView attribute:NSLayoutAttributeRight multiplier:1.0 constant:-right];
    
    self.arrayConstrains = [NSMutableArray arrayWithArray:@[constrainTop,constrainLeft,constrainBottom,constrainRigth]];
    [superView addConstraints:self.arrayConstrains];
}


@end


其他功能正在完善中.

使用方式只需要将Demo中的PBAutolayoutTools.h与.m文件拷贝到项目中即可

github框架下载地址 : https://github.com/adampei/PBautolAyoutTools.git

原文地址:https://www.cnblogs.com/adampei-bobo/p/5448028.html