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
ios - 自动布局框架编写(更多功能完善中)的更多相关文章
- React-Native 之 GD (十一)加载更多功能完善 及 跳转详情页
1.加载更多功能完善 GDHome.js /** * 首页 */ import React, { Component } from 'react'; import { StyleSheet, Text ...
- iOS 自动布局框架 – Masonry 详解
目前iOS开发中大多数页面都已经开始使用Interface Builder的方式进行UI开发了,但是在一些变化比较复杂的页面,还是需要通过代码来进行UI开发的.而且有很多比较老的项目,本身就还在采用纯 ...
- iOS自动布局框架-Masonry详解
首先,在正式使用Masonry之前,我们先来看看在xib中我们是如何使用AutoLayout 从图中我们可以看出,只要设置相应得局限,控制好父视图与子视图之间的关系就应该很ok的拖出你需要的需 ...
- iOS 网络框架编写总结
一,常用 1> 不错的处理接收到的网络图片数据的方法 id img= ISNSNULL(pic)?nil:[pic valueForKey:@"img"]; NSString ...
- iOS自动布局——Masonry详解
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由鹅厂新鲜事儿发表于云+社区专栏 作者:oceanlong | 腾讯 移动客户端开发工程师 前言 UI布局是整个前端体系里不可或缺的一环 ...
- iOS常用框架源码分析
SDWebImage NSCache 类似可变字典,线程安全,使用可变字典自定义实现缓存时需要考虑加锁和释放锁 在内存不足时NSCache会自动释放存储的对象,不需要手动干预 NSCache的key不 ...
- iOS开发UI篇—无限轮播(功能完善)
iOS开发UI篇—无限轮播(功能完善) 一.自动滚动 添加并设置一个定时器,每个2.0秒,就跳转到下一条. 获取当前正在展示的位置. [self addNSTimer]; } -(void)addNS ...
- Fastjson是一个Java语言编写的高性能功能完善的JSON库。
简介 Fastjson是一个Java语言编写的高性能功能完善的JSON库. 高性能 fastjson采用独创的算法,将parse的速度提升到极致,超过所有json库,包括曾经号称最快的jackson. ...
- iOS各框架功能简述以及系统层次结构简单分析
iOS各个框架所对应的功能简单介绍 iOS系统结构层次:
随机推荐
- ACM 盗梦空间
盗梦空间 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描述 <盗梦空间>是一部精彩的影片,在这部电影里,Cobb等人可以进入梦境之中,梦境里的时间会比现实中 ...
- URAL 1057. Amount of Degrees(数位DP)
题目链接 我看错题了...都是泪啊,不存在3*4^2这种情况...系数必须为1... #include <cstdio> #include <cstring> #include ...
- 【hdu2795】Billboard
Problem Description At the entrance to the university, there is a huge rectangular billboard of size ...
- Photoshop教您快速的制作标准一寸证件照教程
Photoshop教您快速的制作标准一寸证件照教程 对急需证件照的朋友,只要有一部相机,有电脑安装了PS软件,就可很快自己完成一寸照片的制作. 首先将相机卡里的照片存放在电脑硬盘里: 打开PS图片处理 ...
- C语言-结构体
#include<stdio.h> struct stu //定义结构体类型 { int num; char *name; char *sex; float score; } boy[]= ...
- Defining custom settings in Odoo
Unfortunately Odoo documentation doesn’t seem to include any information about adding new configurat ...
- 对JS原型的一些理解
一.首先给出一道经典的原型题目: var F = function(){}; Object.prototype.a = function(){}; Function.prototype.b = fun ...
- log4net 添加自定义日志到数据库
添加操作日志到数据库举例: (一)建立数据库的操作日志表,如下我建立了一个简单的日志表 (二)配置文件中的配置如下 <log4net> <!--错误日志记录数据库--> < ...
- Hibernate saveOrUpdate方法到底是怎么执行的?
saveOrUpdate方法,如果传入的对象有主键就执行更新,没有就执行新增.这句话误导了很多人. 究竟是执行新增还是更新,是要有上下文环境的.这个环境就是主键策略的选择. 主键生成方式为 手动设置: ...
- td内容过长,省略号表示
.word{ min-width:100px; max-width:200px; overflow:hidden; white-space:nowrap; text-overflow:ellipsis ...