UITableView出现上移/下移64的问题 解析
2015-10-28 16:27
761 查看
很多人在开发中会遇到, 在一个带navigation的ViewController上添加tableView 会出现 一些上移/下移64的:
![](http://img.blog.csdn.net/20151028144548737)
![](http://img.blog.csdn.net/20151028144604090)
然后打印tableView的frame 发现 没问题啊, 和屏幕尺寸一样的,
然后做一下修改发现上移/下移64, OK, 解决了
然而, 以后还是遇到这样的问题, 难道这是一个偶然?
NONO!!
让你看一下正常的:
![](http://img.blog.csdn.net/20151028151953992)
ok, 你看到了什么, tableView 多了个子视图, cell多了个父视图: UITableViewWrapperView, 并且比tableView少了64
好了, 大概知道问题出在哪了, 那就看一下上移了64的UITableViewWrapperView
![](http://img.blog.csdn.net/20151028153006680)
确实如我们猜测的一样啊, UITableViewWrapperView的frame和tableView是一样的.
终于找到罪魁祸首了! 原来是UITableViewWrapperView在捣鬼!
那他是怎么产生的呢, 怎么设置的他的尺寸呢, 又怎么避免不会出现64的问题呢, 别急, 慢慢来……….
UITableViewWrapperView是iOS7.0之后才添加的一个对象, 在这之前cell的父视图就是UITableView, 但是添加了UITableViewWrapperView之后就不用关心tableView的frame了, UITableViewWrapperView会根据情况进行判断, 那么是什么情况呢, 细心的同学可能已经发现, 正常的与上移64的相比中间似乎多了个绿色的东东. 对没错, 就是他,
问题就出在这里, 当你的view上面添加了一个控件的时候, 再添加tableView时(也就是说tableView不是viewContrller上的第一个视图时), UITableViewWrapperView就会做出判断, 不会下移64
看看下图你就明白了
![](http://img.blog.csdn.net/20151028155019123)
你会发现蓝色的tableView的UITableViewWrapperView的尺寸是下移64的, cell会正常显示, 但是红色的UITableViewWrapperView就和tableView的一样了, cell会上移64
还有一个方法可以证明viewController的view的第一个子视图是tableView时才会正常显示.
运行一下
![](http://img.blog.csdn.net/20151028160450356)
哈哈, 看来 我们猜测是正确的
嗯, 可以了, 以后在创建tableView时注意的上面的问题就行了
你也可以做一下优化, 在
(至于为什么是可以看一下ViewController的生命周期就明白了)
至于系统内部是怎么做到的,水平有限没做深入探究, 个人猜测应该利用是runtime对UITableViewWrapperView做的判断
然后打印tableView的frame 发现 没问题啊, 和屏幕尺寸一样的,
然后做一下修改发现上移/下移64, OK, 解决了
然而, 以后还是遇到这样的问题, 难道这是一个偶然?
NONO!!
让你看一下正常的:
ok, 你看到了什么, tableView 多了个子视图, cell多了个父视图: UITableViewWrapperView, 并且比tableView少了64
好了, 大概知道问题出在哪了, 那就看一下上移了64的UITableViewWrapperView
确实如我们猜测的一样啊, UITableViewWrapperView的frame和tableView是一样的.
终于找到罪魁祸首了! 原来是UITableViewWrapperView在捣鬼!
那他是怎么产生的呢, 怎么设置的他的尺寸呢, 又怎么避免不会出现64的问题呢, 别急, 慢慢来……….
UITableViewWrapperView是iOS7.0之后才添加的一个对象, 在这之前cell的父视图就是UITableView, 但是添加了UITableViewWrapperView之后就不用关心tableView的frame了, UITableViewWrapperView会根据情况进行判断, 那么是什么情况呢, 细心的同学可能已经发现, 正常的与上移64的相比中间似乎多了个绿色的东东. 对没错, 就是他,
问题就出在这里, 当你的view上面添加了一个控件的时候, 再添加tableView时(也就是说tableView不是viewContrller上的第一个视图时), UITableViewWrapperView就会做出判断, 不会下移64
看看下图你就明白了
你会发现蓝色的tableView的UITableViewWrapperView的尺寸是下移64的, cell会正常显示, 但是红色的UITableViewWrapperView就和tableView的一样了, cell会上移64
还有一个方法可以证明viewController的view的第一个子视图是tableView时才会正常显示.
blueTableView = [[UITableView alloc] initWithFrame:[UIScreen mainScreen].bounds]; blueTableView.backgroundColor = [UIColor blueColor]; UITableView *redTableView = [[UITableView alloc] initWithFrame:self.view.frame]; redTableView.backgroundColor = [UIColor redColor]; //先添加红色tableView [self.view addSubview:redTableView]; //再把蓝色视图插入到 View的第一个子视图 [self.view insertSubview:blueTableView atIndex:0]; /*按照我们的猜测 blueTableView的 cell应该是正常显示的, 而redTableView会上移*/
运行一下
哈哈, 看来 我们猜测是正确的
嗯, 可以了, 以后在创建tableView时注意的上面的问题就行了
你也可以做一下优化, 在
viewWillLayoutSubviews中添加下列代码:
(至于为什么是可以看一下ViewController的生命周期就明白了)
- (void)viewWillLayoutSubviews { if (self.view.subviews[0] != self.tableView) { //self.tableView是我们希望正常显示cell的视图 self.tableView.subviews[0].frame = CGRectMake(0, 64, kScreenW, kScreenH); } } /*或者设置 tableView的y : 64*/ //如果navigationbar.translucent = YES; scrollview会被自动设置contentInset.top=64 - (void)viewWillLayoutSubviews { [super viewWillLayoutSubviews]; _tableView.contentInset = UIEdgeInsetsZero; _tableView.scrollIndicatorInsets = UIEdgeInsetsZero; }
至于系统内部是怎么做到的,水平有限没做深入探究, 个人猜测应该利用是runtime对UITableViewWrapperView做的判断
相关文章推荐
- 给JSON中put的value=null时,这对key=value会被隐藏掉。
- getRequestDispatcher()与sendRedirect()的区别
- Java使用BlockingQueue实现生产者消费者模式
- UITableView-cell 的重用机制
- Your build settings specify a provisioning profile with the UUID “”, however, no such provisioning p
- IOS笔记UI--固定宽度,根据内容动态改变高度
- IOS UITableView分组列表
- UIScrollView的属性总结
- UE3 iPhonePackager 工具
- UE3游戏性分析器
- UE3 性能调试
- iOS9之前,UINavigationController控制器子类无法控制器StatusBar的样式
- include require _once
- iOS开发之UITextView,设置textView的行间距及placeholder
- 8.5.6 Optimizing InnoDB Queries 优化InnoDB 查询
- POST上传文件之分类抽取——以后只需要把分类导入,使用NSMutableURLRequest的分类即可
- java.lang.IllegalArgumentException: Page directive: invalid value for import
- 智能车上位机与下位机通信的例子
- iOS UICollectionView reloadData后找到某个cell 更新某个cell数据
- 基于xcodebuild和xcrun的自动化打包