最近一段时间项目没有那么近,发现Github上有个关于iOS的使用纯代码的布局库MyLayout(github地址:MyLayout地址),下载下来发现还不错,故就把自己使用的一些经验分享给大家。
iOS中有个很重的控件叫做UIView,该控件也就是iOSUIKit框架中的一个类,简称视图控件。自从苹果推出了iPhone6/iPhone 6Plus以后,iOS开发屏幕适配的问题也变得越来越重要了,单纯的用frame去进行布局来达到适配所有的屏幕尺寸,经常会出现大量的判断语句以及常数计算,因此一套强大的UI布局库的出现是必然的。
MyLayout布局库十分强大,该库拥有:
线性布局TGLinearLayout:
线性布局里面的所有子视图都按照添加的顺序依次从上到下或者依次从左到右进行排列。
框架布局TGFrameLayout:
框架布局里面的所有子视图布局时和添加的顺序无关,而是按照设定的位置停靠在布局视图的:左上、左中、左下、中上、中中、中下、右上、右中、右下、填充这个10个方位中的任何一个位置上。
表格布局TGTableLayout:
表格布局里面的子视图可以进行多行多列的排列。在使用时要先添加行,然后再在行里面添加列,每行的列数可以随意确定。
相对布局TGRelativeLayout:
相对布局里面的子视图和添加的顺序无关,而是按照子视图之间设定的尺寸约束依赖和位置约束依赖进行布局排列。
流式布局TGFlowLayout:
流式布局里面的子视图按照添加的顺序依次从某个方向排列,而当遇到了这个方向上的排列数量限制或者容器的尺寸限制后将会另起一行,而重新按照原先的方向依次排列。
浮动布局TGFloatLayout:
浮动布局里面的子视图按照添加的顺序,并且按照每个子视图自身设定的浮动规则向某个方向进行浮动停靠。
路径布局TGPathLayout:
路径布局里面的子视图按照一个提供的数学函数得到的曲线路径等距离的根据添加的顺序依次排列。
接下来我们就来看看MyLayout是怎么使用的。
1.下载官方的MyLayout库地址
demo主要文件目录如下
2.新建自己的一个练习工程
导入示例工程中的Lib库,在自己新建的控制器中导入MyLayout.h文件就可以进行UI布局的开发了。
今天主要讲的是MyLayout中的线性布局,那么什么是线性布局呢?
线性布局里面的所有子视图都按照添加的顺序依次从上到下或者依次从左到右进行排列。根据排列的方向可以分为垂直线性布局和水平线性布局。
也就是说线性布局是根据视图加入的顺序进行先后顺序进行排列的。在MyLayout布局库中的线性布局中有垂直线性布局和水平线性布局。
垂直线性布局:
MyLinearLayout *vertLayout = [MyLinearLayout linearLayoutWithOrientation:MyLayoutViewOrientation_Vert];
对于垂直线性布局里面的子视图来说:
1 如果不设置任何边距则每个子视图的左边距都跟父视图左对齐,而上下则一次按加入的顺序排列。
2 myLeftMargin, myRightMargin的意义是子视图距离父视图的左右边距。
3 myTopMargin, myBottomMargin的意义是子视图和兄弟视图之间的上下间距。
4 如果同时设置了myLeftMargin,myRightMargin则除了能确定左右边距,还能确定子视图的宽度。
5 如果同时设置了myTopMargin,myBottomMargin则只能确定和其他兄弟视图之间的上下间距,但不能确定子视图的高度。
6 myCenterXOffset表示子视图的水平中心点再父视图的水平中心点上的偏移。
7 myCenterYOffset的设置没有意义。
水平线性布局:
MyLinearLayout *horzLayout = [MyLinearLayout linearLayoutWithOrientation:MyLayoutViewOrientation_Horz];
对于水平线性布局里面的子视图来说:
1 如果不设置任何边距则每个子视图的上边都跟父视图上对齐,而左右则依次按加入的顺序排列。
2 myTopMargin,myBottomMargin的意义是子视图距离父视图的上下边距
3 myLeftMargin,myRightMargin的意义是子视图和兄弟视图之间的左右间距
4 如果同时设置了myTopMargin,myBottomMargin则除了能确定上下边距,还能确定子视图的高度。
5 如果同时设置了myLeftMargin,myRightMargin则只能确定和其他兄弟视图之间的左右间距,但不能确定子视图的宽度。
6 myCenterYOffset表示子视图的垂直中心点再父视图的垂直中点上的偏移
7 myCenterXOffset的设置表示没有意义
运行Demo中的示例
从运行的结果来看模拟器中的上部分是一个垂直布局视图,视图的显示按照子视图的添加的顺序依次排序。
下部是一个水平布局视图,视图的显示按照子视图的添加顺序依次排列。
需要注意的是:在垂直布局视图中,我们如果设置了子视图的左边距和右边距可以确定视图的宽度,而同时设置了上下边距是不能确定子视图的高度的,因此我们要指定子视图的高度才能确定子视图的高度。
同理水平布局视图中,我们如设置了子视图的上下边距可以确定子视图的高度,同时设置了左右边距却不可以确定子视图的宽度,需要明确指明子视图的宽度。
在线性布局中,也可以设置frame属性,它与myLeftMargin,myRightMargin,myTopMargin,myBottomMargin等属性不同的是,frame设置以后会立即生效,后者是等布局完成以后才会生效。但是都是可以通过frame获取布局完成以后的origin和size属性值。
这是对于线性布局的牛刀小试,详细信息请参考iOS界面布局的核心以及TangramKit介绍。
网友评论