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系统结构层次:
随机推荐
- CentOS 6.6 下配置软RAID5
在虚拟机中增加4块5G的硬盘 安装依赖包 yum install -y parted mdadm 查看一下硬盘信息fdisk -l
- JS性能优化笔记搜索整理
通过网上查找资料了解关于性能优化方面的内容,现简单整理,仅供大家在优化的过程中参考使用,如有什么问题请及时提出,再做出相应的补充修改. 一. 让代码简洁:一些简略的表达方式也会产生很好的优化 eg:x ...
- Codeforces Beta Round #3
A题,水题,还是无法1Y. B题,题意是类似背包的问题,在v的容量下,有1重量和2重量的,如果达到价值最大. 贪心,写的很恶心.看着数据过了. 奇数的时候,先选一个1.之后然后1+1 和 2 比较就行 ...
- 500-internal server error 错误提示到配置文件的某行,并显示乱码
UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码,又称万国码.UTF-8用1到4个字节编码UNICODE字符.用在网页上可 ...
- C#中的接口
C#中的接口(转) 转自:http://www.cnblogs.com/zhenyulu/articles/377705.html 本文中所有图示纯为个人理解(参考了Assembly中元数据的存储方式 ...
- C#多线程操作界面控件的解决方案(转)
C#中利用委托实现多线程跨线程操作 - 张小鱼 2010-10-22 08:38 在使用VS2005的时候,如果你从非创建这个控件的线程中访问这个控件或者操作这个控件的话就会抛出这个异常.这是微软为了 ...
- mysql命令行参数(转)
MySQL命令行参数 Usage: mysql [OPTIONS] [database] //命令方式 -?, --help //显示帮助信息并退出 -I, --help //显示帮助信息并退出 ...
- Jquery用法
$this.closest("dd").addClass("selected").siblings().removeClass("selected&q ...
- HTTPS原理介绍
内容来源于:http://www.guokr.com/post/114121/ 自己做个备忘. 二.HTTPS到底安全吗? 这个答案是肯定的,很安全.谷歌公司已经行动起来要大力推广HTTPS的使用,在 ...
- 关于WPF中ItemsControl系列控件中Item不能继承父级的DataContext的解决办法
WPF中所有的集合类控件,子项都不能继承父级的DataContext,需要手动将绑定的数据源指向到父级控件才可以. <DataGridTemplateColumn Header="操作 ...