zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    封了1000多个IP地址段,服务器现在坚如磐石,对付几个小毛贼还是很轻松的
    这两周服务器被攻击,封锁了600多个IP地址段后今天服务器安静多了
    centos clamav杀毒软件安装配置及查杀,没想到linux下病毒比windows还多!
    JS 在页面上直接将json数据导出到excel,支持chrome,edge,IE10+,IE9,IE8,Safari,Firefox
    一个实战系统的权限架构思维推导过程
    股灾情形下搞了个满堂红,我也是醉了
    VBC#代码互转工具
    DSAPI多功能.NET函数库组件
    DS标签控件文本解析格式
    DSAPI官方QQ群
  • 原文地址:https://www.cnblogs.com/adampei-bobo/p/5448028.html
Copyright © 2011-2022 走看看