前面的几篇文章里我分别介绍了线性布局(MyLinearLayout),相对布局(MyRelativeLayout),框架布局(MyFrameLayout)这三种布局。这三种布局中 :git
线性布局主要应用于容器视图里面的全部子视图依次从上往下排列或者从左往右排列的场景。github
子视图1 |
子视图2 |
子视图3 |
子视图4 |
子视图1 | 子视图2 | 子视图3 | 子视图4 |
固然咱们也能够用线性布局嵌套线性布局的方法来实现一些复杂的界面布局,好比(这个例子若是用MyTableLayout实现将更加简单):xcode
|
|||
|
|||
|
相对布局主要用于容器视图中的各个子视图之间的位置和高宽以及子视图和容器视图之间具备必定的依赖和约束关系的场景。好比说子视图1的位置在子视图2的右下角,而且宽度等于子视图3的宽度,而子视图3的底部又在容器视图的底部。app
子视图1(等宽3) | ||
子视图2 | ||
子视图3(等宽1) |
相对布局由于须要指定各子视图之间的依赖关系,所以若是设置不当就会产生递归死循环的状况,并且在某种程度上不利于子视图之间的位置的更新和变化等等,其中IOS自带的AutoLayout其实就是一套相对布局的实现,相对布局功能很强大也能够很容易布局复杂的界面,缺点是使用不当的话就容易形成约束死循环的状况。框架
框架布局主要用于容器视图中的个子视图在容器视图的上,中,下,左,中,右,拉升填充,居中显示等11种状况。函数
左上 | 中上 | 右上 |
左中 | 居中 | 右中 |
左下 | 中下 | 右下 |
框架布局中的子视图只跟容器视图之间产生关系,子视图之间没有任何关联关系。oop
1、表格布局的介绍布局
在一些实际的应用界面中,咱们但愿咱们的子视图以表格的形式展现出来,这些表格展现能够是正规的几行几列而且固定高宽的形式,也多是每一行的列数都不一样,也多是每行的高度不同,也多是一行内的各列的宽度也不同,atom
水平表格布局spa
垂直表格布局
要实现上面的两种界面风格,咱们能够借助MyTableLayout来实现。
MyTableLayout是从MyLinearLayout中继承而来,所以表格布局也分为垂直表格布局和水平表格布局,样式请参考上面的图例的展现风格。而表格的风格样式一样经过
orientation属性来设置。不论是垂直表格布局仍是水平表格布局。咱们在创建了表格布局视图并指定了表格风格后,咱们首先的步骤是要为表格添加行(若是是水平表格其实就是添加列,下面若是为说明都是如此概念),那这个步骤能够经过MyTableLayout的方法:
-(void)addRow:(CGFloat)rowHeight colWidth:(CGFloat)colWidth;
-(void)insertRow:(CGFloat)rowHeight colWidth:(CGFloat)colWidth atIndex:(NSInteger)rowIndex;
来实现,前者是往表格布局尾部添加一行,然后者则是在指定的位置插入一行。这里须要说明的参数是rowHeight,colWidth的意义,咱们知道只要咱们插入一行时咱们老是须要指出插入的这一行的行高是多少,同时要指出插入的这行的列单元格的宽度是如何指定的(每列的宽度固定,仍是有单元格本身指定等等)
rowHeight为-1时表示由最高的单元格视图决定本行高度,每一个单元格视图须要本身设置高度;为0表示均分高度,单元格视图不须要设置高度;大于0表示固定高度,单元格视图不须要设置高度.
colWidth 为-2时表示每一个单元格视图须要本身指定宽度,总体行宽和表格布局一致;为-1表示每一个单元格视图须要本身指定宽度,整个行宽包裹全部子视图;为0表示均分宽度,这时候单元格视图没必要设置宽度;大于0表示单元格视图固定宽度,这时候单元格视图能够没必要设置宽度。
同时咱们也提供了对行操做的其余方法:
//删除指定的行
-(void)removeRowAt:(NSInteger)rowIndex;
//交行两个行的内容
-(void)exchangeRowAt:(NSInteger)rowIndex1 withRow:(NSInteger)rowIndex2;
//获得行视图,从返回咱们能够看出,咱们调用插入行操做时,系统内部会自动创建一个MyLinearLayout线性布局视图做为行视图,若是是垂直表格则默认是水平线性布局,而若是是水平表格则默认是垂直线性布局,所以咱们能够经过这个方法来设置行的其余的各类属性,好比说行间距(xxxMargin来实现)。
-(MyLinearLayout*)viewAtRowIndex:(NSInteger)rowIndex;
//返回当前有多少行
-(NSUInteger)countOfRow;
-(void)addCol:(UIView*)colView atRow:(NSInteger)rowIndex;
-(void)insertCol:(UIView*)colView atIndexPath:(NSIndexPath*)indexPath;
-(void)removeColAt:(NSIndexPath*)indexPath;
-(void)exchangeColAt:(NSIndexPath*)indexPath1 withCol:(NSIndexPath*)indexPath2;
@interface NSIndexPath(MyTableLayoutEx)
+(instancetype)indexPathForCol:(NSInteger)col inRow:(NSInteger)row;
@property(nonatomic,assign,readonly)NSInteger col;
@end
同时咱们也方便的提供了单元格列视图的获取和数量的获取的方法
//返回列视图
-(UIView*)viewAtIndexPath:(NSIndexPath*)indexPath;
//返回指定行的列的数量。
-(NSUInteger)countOfColInRow:(NSInteger)rowIndex;
orientation = LVORIENTATION_HORZ, 水平表格也就是一个瀑布流风格的表格,咱们能够经过将表格放入到UIScrollView中进行从上到下的滚动以便展现全部内容。先看界面布局效果:
4、总结
好了,表格布局的内容就介绍到这里了,表格布局的内部实现其实就是一个线性布局套线性布局的封装,可是他简化了咱们插入视图的方法,从而很容易的布局出各类风格的布局,咱们能够从上往下依次布局,也能够从左往右依次布局。若是您以为这篇文章可以帮助到您,或者能成为您界面布局的解决方案,那么请到个人github:
https://github.com/youngsoft/MyLinearLayout 中下载这套界面解决框架库,若是您以为好用就记得给我点赞哦,若是有什么不明确的能够加我QQ:156355113联系我。