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

  • 相关阅读:
    Screen print or copy
    <转>关于SQL Server数据库的若干注意事项
    sql server 链接到oracle库,读取对应信息
    LinkedServer链接服务器的使用
    序号生成一例
    新解:报表服务器数据库的版本格式无效,或无法读取。已找到的版本为“Unknown”,而所需的版本为“C.0.8.40”。
    GridView to Excel
    sql server临时表是否存在
    <转>SQL Server大表转为分区表实例
    <转> 人生十二个经典领悟
  • 原文地址:https://www.cnblogs.com/adampei-bobo/p/5448028.html
Copyright © 2011-2022 走看看