Masonry是一个轻量级的布局框架,拥有自己的描述语法,采用更优雅的链式语法封装自动布局,简洁明了并具有高可读性,而且同时支持 iOS 和 Max OS X。Masonry是一个用代码写iOS或OS界面的库,可以代替Auto layout。Masonry的github地址:https://github.com/SnapKit/Masonry
Masonry使用讲解:
mas_makeConstraints 是给view添加约束,约束有几种,分别是边距,宽,高,左上右下距离,基准线。添加过约束后可以有修正,修正有offset(位移)修正和multipliedBy(倍率)修正。
语法一般是 make.equalTo or make.greaterThanOrEqualTo or make.lessThanOrEqualTo + 倍数和位移修正。
注意点1: 使用 mas_makeConstraints方法的元素必须事先添加到父元素的中,例如[self.view addSubview:view];
注意点2: masequalTo 和 equalTo 区别:masequalTo 比equalTo多了类型转换操作,一般来说,大多数时候两个方法都是 通用的,但是对于数值元素使用mas_equalTo。对于对象或是多个属性的处理,使用equalTo。特别是多个属性时,必须使用equalTo,例如 make.left.and.right.equalTo(self.view);
注意点3: 注意到方法with和and,这连个方法其实没有做任何操作,方法只是返回对象本身,这这个方法的左右完全是为了方法写的时候的可读性 。make.left.and.right.equalTo(self.view);和make.left.right.equalTo(self.view);是完全一样的,但是明显的加了and方法的语句可读性 更好点。
下面带着例子来看一下基础用法,假设我们现在的需求是:
1.我们现在只能确定我们控件的宽高以及左右的边距,需要对上下进行自动适应。
2.假设我们现在有四个控件,需要布局的界面是这个样子的
竖屏效果:
横屏效果:
第一步:在我们的控制器中导入Masonry所需要的文件
#define MAS_SHORTHAND #define MAS_SHORTHAND_GLOBALS #import "Masonry.h"
//上面的占位视图 UIView *topView = UIView.new; topView.backgroundColor = [UIColor redColor]; [self.view addSubview:topView]; //中间的占位视图 UIView *centerView = UIView.new; centerView.backgroundColor = [UIColor grayColor]; [self.view addSubview:centerView]; //下面的占位视图 UIView *bottomView = UIView.new; bottomView.backgroundColor = [UIColor blackColor]; [self.view addSubview:bottomView];
//给上面的占位视图添加约束 [topView makeConstraints:^(MASConstraintMaker *make) { //头部及左边距分别为0 make.top.left.equalTo(self.view).offset(0); //三个占位视图的高度等高 make.height.equalTo(@[centerView,bottomView]); //设置top视图的高度 make.width.equalTo(100); }]; //中间视图的需要添加以下约束,高度、左边以及与上方占位视图的关系 [centerView makeConstraints:^(MASConstraintMaker *make) { //左边的约束 make.left.equalTo(self.view).offset(0); //设置三个占位视图等高 make.width.equalTo(@[topView,bottomView]); //设置中间占位视图与上方视图的关联约束 make.top.equalTo(topView.bottom).offset(150);}]; //下面的约束主要设置下面的与中间视图的约束以及本身左边距的约束 [bottomView makeConstraints:^(MASConstraintMaker *make) { make.left.bottom.equalTo(self.view).offset(0); make.top.equalTo(centerView.bottom).offset(150);
}];
由此我们发现中间空出的部分正好就是我们控件所需的位置了,那么下面我们就开始进行对控件的布局了。首先还是添加需要的左边的控件
UIImageView *imageView1 = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"a"]]; [self.view addSubview:imageView1]; UIImageView *imageView2 = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"b"]]; [self.view addSubview:imageView2];//然后对这两个控件进行布局
[imageView1 makeConstraints:^(MASConstraintMaker *make) { //分别设置起宽高 make.width.height.equalTo(150); //左边的边距 make.left.equalTo(self.view).offset(0); //设置其与上面占位视图和下面占位视图的间距 make.top.equalTo(topView.bottom).offset(0); make.bottom.equalTo(centerView.top).offset(0); //控件2同上。 [imageView2 makeConstraints:^(MASConstraintMaker *make) { make.width.height.equalTo(150); make.left.equalTo(self.view).offset(0); make.top.equalTo(centerView.bottom).offset(0); make.bottom.equalTo(bottomView.top).offset(0);
}];
到了这里我们就可以对右边的控件进行布局了。基于之前的经验我们就会发现右边的约束只需要添加本身的宽、高和右边边距以及基于左边控件的centerY值就足够了。好了,我们开始吧。
UIImageView *imageView3 = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"a"]]; [self.view addSubview:imageView3]; UIImageView *imageView4 = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"b"]]; [self.view addSubview:imageView4];//该控件与左边的控件的关联 [imageView3 makeConstraints:^(MASConstraintMaker *make) { make.width.height.equalTo(150); make.right.equalTo(self.view).offset(0); make.centerY.equalTo(imageView1);
}]; //同上 [imageView4 makeConstraints:^(MASConstraintMaker *make) { make.width.height.equalTo(150); make.right.equalTo(self.view).offset(0); make.centerY.equalTo(imageView2);
}];
//另外两个也是 bottomView.backgroundColor = [UIColor clearColor];
到了这里我们基本上就把基本的占位视图的介绍了联系完了。通过联系你可能会发现,无论是在StoryBoary上添加约束还是通过编码进行的智能布局都是基于对父控件或者对其他控件进行的关联。当然了如果你对AutoLayout的编码布局的话就可能就会觉得Masonry真的是好用的爆了。当然了,这么强大的Masonry,提供的功能也是很多的,这些就要靠大家来探索了,嘿嘿。
本文向大家介绍深入理解IOS控件布局之Masonry布局框架,包括了深入理解IOS控件布局之Masonry布局框架的使用技巧和注意事项,需要的朋友参考一下 前言: 回想起2013年做iOS开发的时候,那时候并没有采用手写布局代码的方式,而是采用xib文件来编写,如果使用纯代码方式是基于window的size(320,480)计算出一个相对位置进行布局,那个时候windows的size是固定不变的,
前述关于线程的栈大小问题,其实栈是可以动态增长的,只不过为了效率问题,一般都是固定的,这是一个实现相关,并非线程的原罪;不过说的第二点,线程调度需要陷入内核,这个的确非常影响效率。而协程没有这两个问题,首先所有协程本质是可以在一个线程里面执行,一个协程切换的时候是暂时返回,执行栈都是复用的,随便开个比较大的空间就行了,协程的状态在堆上申请,可以按需申请,因此协程可以开很多很多,百万级都没问题;另一
本文向大家介绍Android开发之基本控件和四种布局方式详解,包括了Android开发之基本控件和四种布局方式详解的使用技巧和注意事项,需要的朋友参考一下 Android中的控件的使用方式和iOS中控件的使用方式基本相同,都是事件驱动。给控件添加事件也有接口回调和委托代理的方式。今天这篇博客就总结一下Android中常用的基本控件以及布局方式。说到布局方式Android和iOS还是区别挺大的,在i
数据解析脚本开发框架-脚本定义 透传脚本功能介绍 脚本定义 语言定义 方法定义 Alink协议数据转二进制数据 二进制数据转Alink协议数据 自动生成脚本 示例demo 相关产品操作 绑定脚本代码 数据测试 设备上报数据测试数据 上报数据输出结果 设备接收数据测试数据 接收数据输出结果 Demo也支持在本地环境中进行调用 数据解析脚本开发框架-脚本定义 更新时间:2018-07-02 15:13
10.2.TimelineActivity的基本布局 在第一次迭代中,我们为TimelineActivity创建一个新的布局(Layout),它使用一个TextView来展示数据库中的所有消息。在刚开始的时候数据量不大,这样还是没有问题的。
本文向大家介绍Android XUtils3框架的基本使用方法(二),包括了Android XUtils3框架的基本使用方法(二)的使用技巧和注意事项,需要的朋友参考一下 上一篇Android中XUtils3框架使用方法详解(一)文章,主要介绍了XUtil3的注解模块,网络模块,图片加载模块,今天给大家带来数据库模块的讲解,现在主流的ORM框架很多,比如OrmLite,GreenDao,Activ