首页 技术 正文
技术 2022年11月6日
0 收藏 611 点赞 736 浏览 2081 个字

之前看到Apple store里面有横向的tableview,当然也有可能是collectionview啦。

尤其是项目中只有一条那么需要横向滑动的东西,就没有必要使用庞大的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,就不解释为什么是这个值了,因为我不知道言语怎么表达,我也找不到合适的画图工具。自己体验一下就能体会到。

所以此时的横向tableview向右向上都偏移  ABS(self.bounds.size.width – self.bounds.size.height) / 2  这个距离就好了。

剩下的就是封装的时候,实现UITableView的回调了,UITableView的必须实现的回调就必须实现了,然后非必需的也可以二次封装,此时还可以给一个默认的的值,以便不实现改回调时该轮子能给出默认的值,如下面的这个样子:

 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
if ([self.delegate_Y respondsToSelector:@selector(h_tableView:heightForRowAtIndexPath:)]) {
return [self.delegate_Y h_tableView:self heightForRowAtIndexPath:indexPath];
}
return ;
}

必须实现的回调也贴出来一下吧:

 #pragma mark - UITableViewDataSource
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
if ([self.dataSource_Y respondsToSelector:@selector(h_tableView:numberOfRowsInSection:)]) {
return [self.dataSource_Y h_tableView:self numberOfRowsInSection:section];
}
return ;
} - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
if ([self.dataSource_Y respondsToSelector:@selector(h_tableView:cellForRowAtIndexPath:)]) {
return [self.dataSource_Y h_tableView:self cellForRowAtIndexPath:indexPath];
}
return nil;
}

不用仔细看代码也没问题,最后我会贴出coding的链接,可以去下载源码看看

因为UITableView的回调,太多了,我就封装了几个,如果你需要更多的,可以另行的仿照实现。

说了这么多,再说说这个轮子的弱点吧,因为在使用xib或者storyboard拖约束布局的时候会产生问题,所以代码中,默认的注释掉了- (instancetype)initWithCoder:(NSCoder *)coder。推荐直接代码写frame。

因为cell已经被旋转,所以直接正常的frame的布局就可以了。

代码:https://coding.net/u/ysk/p/HorizontalTableView/git

就写到这吧,有什么不妥或者感觉我写的有什么不对的地方,欢迎指正啊。

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,492
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,907
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,740
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,493
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:8,132
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:5,295