ios - 自动布局框架编写(更多功能完善中)
2016-04-30 02:58
435 查看
之前用的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
相关文章推荐
- iOS开发 - CocoaPods安装和使用教程
- 懒惰的 initialize 方法
- 玩玩Xamarin Evolve 2016带来的新特性(一)-iOS Simulator(for Windows)
- IOS几种定时器
- 视频播放 iOS8.0 与iOS 9.0
- iOS开发之旋转动画及GIF格式图片的播放
- ARC下可能的内存泄露
- iOS:导航条滚动透明度随着tableView的滚动而变化
- iOS Masonry 纯代码布局 AutoLayout
- iOS: 环信的推送
- iOS开发过程中的各种tips
- iOS开发中 实现登录时关于使用QQ做为第三方授权登录的问题
- iOS开发总结之 NSString和NSMutableString
- IOS推送PEM生成
- iOS应用程序生命周期(前后台切换,应用的各种状态)详解
- ios 硬件 导航 - 百度地图SDK
- iOS 硬件 导航 - 系统请求数据 绘制路线
- iOS 硬件 大头针 - 基础 添加
- iOS 硬件 地图-基础-自定义追踪
- iOS 硬件 地图- 基础