UITableView中tableHeadView的BUG
2016-06-02 10:00
381 查看
1、BUG出现场景
描述:这个BUG出现的很奇怪,我的代码风格在UITableView中自定义tableHeadView都是采用XIB,然后通过封装,直接这么调用:
return [[[NSBundle mainBundle] loadNibNamed:@"TYLocationTableHeadView" owner:nil options:nil] lastObject];
今天这种做法出现了问题,在XIB画图中,习惯控制死所有视图高度,然后将XIB拉的很长,而视图初始化完毕,直接采用Frame布局:
UIView *headView = [TYLocationTableHeadView headView];
containHeadView.backgroundColor = [UIColor redColor];
<pre name="code" class="objc"> headView.frame = cgrectmakexxxxxxx; self.tableView.tableHeaderView = containHeadView;
这种写法,出现了问题,视图的实际尺寸很小,以前没有出现过是因为头部没有交互,而今天headView中有UIButton,造成无法点击,然后通过视图查看,看到视图实际的高度跟代码设置的高度不相等,到此问题算是发现了, 一个自动布局,一个frame布局,二者不等。
2、尝试解决一
既然二种布局混合了,那改成一种布局不就OK了吗?
全部采用frame的布局是肯定可以的,但是工作量太大,只有全部autolayout了,但是改完后发现,UITableView的tableHeadView的宽度不是跟tableivew宽度一样,
这下日了狗了,高度固定,上,左,右间距为0,是一块小视图
3、终极解决
既然固定frame可以,那我想到,先固定,视图弄出来先,然后出现 了固定大小的视图,接着再自动布局,等于在自定义XIB视图外部包装一层,看代码:
CGFloat headViewHeight = cacheCitysArray.count == 0 ? (26 + 42) : (26 + 42) * 2;
UIView *containHeadView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, headViewHeight)];
containHeadView.backgroundColor = [UIColor redColor];
self.tableView.tableHeaderView = containHeadView;
TYLocationTableHeadView *headView = [TYLocationTableHeadView headView];
headView.delegate = self;
[containHeadView addSubview:headView];
[headView autoPinEdgesToSuperviewEdgesWithInsets:UIEdgeInsetsZero];
4、最好思考
以前问过一个老开发人员,什么时候用frame什么时候用autolayout,他说经验,现在也明白当初他说的,视图布局,没有哪种最好,只有最有效解决办法。
描述:这个BUG出现的很奇怪,我的代码风格在UITableView中自定义tableHeadView都是采用XIB,然后通过封装,直接这么调用:
return [[[NSBundle mainBundle] loadNibNamed:@"TYLocationTableHeadView" owner:nil options:nil] lastObject];
今天这种做法出现了问题,在XIB画图中,习惯控制死所有视图高度,然后将XIB拉的很长,而视图初始化完毕,直接采用Frame布局:
UIView *headView = [TYLocationTableHeadView headView];
containHeadView.backgroundColor = [UIColor redColor];
<pre name="code" class="objc"> headView.frame = cgrectmakexxxxxxx; self.tableView.tableHeaderView = containHeadView;
这种写法,出现了问题,视图的实际尺寸很小,以前没有出现过是因为头部没有交互,而今天headView中有UIButton,造成无法点击,然后通过视图查看,看到视图实际的高度跟代码设置的高度不相等,到此问题算是发现了, 一个自动布局,一个frame布局,二者不等。
2、尝试解决一
既然二种布局混合了,那改成一种布局不就OK了吗?
全部采用frame的布局是肯定可以的,但是工作量太大,只有全部autolayout了,但是改完后发现,UITableView的tableHeadView的宽度不是跟tableivew宽度一样,
这下日了狗了,高度固定,上,左,右间距为0,是一块小视图
3、终极解决
既然固定frame可以,那我想到,先固定,视图弄出来先,然后出现 了固定大小的视图,接着再自动布局,等于在自定义XIB视图外部包装一层,看代码:
CGFloat headViewHeight = cacheCitysArray.count == 0 ? (26 + 42) : (26 + 42) * 2;
UIView *containHeadView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, headViewHeight)];
containHeadView.backgroundColor = [UIColor redColor];
self.tableView.tableHeaderView = containHeadView;
TYLocationTableHeadView *headView = [TYLocationTableHeadView headView];
headView.delegate = self;
[containHeadView addSubview:headView];
[headView autoPinEdgesToSuperviewEdgesWithInsets:UIEdgeInsetsZero];
4、最好思考
以前问过一个老开发人员,什么时候用frame什么时候用autolayout,他说经验,现在也明白当初他说的,视图布局,没有哪种最好,只有最有效解决办法。
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- 讲解iOS开发中基本的定位功能实现
- iOS中定位当前位置坐标及转换为火星坐标的方法
- js判断客户端是iOS还是Android等移动终端的方法
- iOS应用开发中AFNetworking库的常用HTTP操作方法小结
- iOS应用中UISearchDisplayController搜索效果的用法
- IOS开发环境windows化攻略
- iOS应用中UITableView左滑自定义选项及批量删除的实现
- iOS中UIAlertView警告框组件的使用教程
- 浅析iOS应用开发中线程间的通信与线程安全问题
- 检测iOS设备是否越狱的方法
- .net平台推送ios消息的实现方法
- 探讨Android与iOS,我们将何去何从?
- Android、iOS和Windows Phone中的推送技术详解