以前看到Apple store里面有横向的tableview,固然也有多是collectionview啦。git
尤为是项目中只有一条那么须要横向滑动的东西,就没有必要使用庞大的collectionview了,点缀的使用一下横向的tableview反而更方便和灵活。固然此处大部分的状况多是在父tableview的cell中使用个横向的tableview。工具
下面就简单的介绍一下,基于系统原生的UITableView封装横向tableview的要点。布局
我封装tableview的时候主要使用了一种比较流行的方法,tableview旋转-PI/2个单位的弧度(即逆时针旋转90度),cell旋转PI/2个单位弧度(即顺时针旋转90度)。这样的最终结果就是tableview成为了横向的。封装的过程当中有一个地方比较难以理解的,就是横向的tableview的point问题,由于旋转,默认的是以tableview的中心点旋转,这样就形成了旋转后“看起来”的位置或者说Frame发生了改变,因此要修复这个由于旋转形成的“Frame误差”。此处,你能够拿着你的手机,竖着放在一张竖着的A4纸上面,手机的左上角与A4纸左上角重合,意味着point为(0,0),而后你把手机逆时针旋转90度,看看有什么结果,结果应该是,手机左面突出了A4纸一部分,上面也距离纸的顶边必定的距离。那么这个距离是多少呢,应该就是长的二分之一减去宽的二分之一,具体的代码就是这样写的ABS(self.bounds.size.width - self.bounds.size.height) / 2,就不解释为何是这个值了,由于我不知道言语怎么表达,我也找不到合适的画图工具。本身体验一下就能体会到。spa
因此此时的横向tableview向右向上都偏移 ABS(self.bounds.size.width - self.bounds.size.height) / 2 这个距离就行了。.net
剩下的就是封装的时候,实现UITableView的回调了,UITableView的必须实现的回调就必须实现了,而后非必需的也能够二次封装,此时还能够给一个默认的的值,以便不实现改回调时该轮子能给出默认的值,以下面的这个样子:code
1 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 2 if ([self.delegate_Y respondsToSelector:@selector(h_tableView:heightForRowAtIndexPath:)]) { 3 return [self.delegate_Y h_tableView:self heightForRowAtIndexPath:indexPath]; 4 } 5 return 100; 6 }
必须实现的回调也贴出来一下吧:blog
1 #pragma mark - UITableViewDataSource 2 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 3 if ([self.dataSource_Y respondsToSelector:@selector(h_tableView:numberOfRowsInSection:)]) { 4 return [self.dataSource_Y h_tableView:self numberOfRowsInSection:section]; 5 } 6 return 0; 7 } 8 9 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 10 if ([self.dataSource_Y respondsToSelector:@selector(h_tableView:cellForRowAtIndexPath:)]) { 11 return [self.dataSource_Y h_tableView:self cellForRowAtIndexPath:indexPath]; 12 } 13 return nil; 14 }
不用仔细看代码也没问题,最后我会贴出coding的连接,能够去下载源码看看get
由于UITableView的回调,太多了,我就封装了几个,若是你须要更多的,能够另行的仿照实现。源码
说了这么多,再说说这个轮子的弱点吧,由于在使用xib或者storyboard拖约束布局的时候会产生问题,因此代码中,默认的注释掉了- (instancetype)initWithCoder:(NSCoder *)coder。推荐直接代码写frame。it
由于cell已经被旋转,因此直接正常的frame的布局就能够了。
代码:https://coding.net/u/ysk/p/HorizontalTableView/git
就写到这吧,有什么不妥或者感受我写的有什么不对的地方,欢迎指正啊。