UITableView出现上移/下移64的问题 解析

原文地址:http://blog.csdn.net/zhz459880251/article/details/49470461


很多人在开发中会遇到, 在一个带navigation的ViewController上添加tableView 会出现 一些上移/下移64的:

这里写图片描述

这里写图片描述

然后打印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会上移*/
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

运行一下 
这里写图片描述

哈哈, 看来 我们猜测是正确的

嗯, 可以了, 以后在创建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;
}
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

至于系统内部是怎么做到的,水平有限没做深入探究, 个人猜测应该利用是runtime对UITableViewWrapperView做的判断


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值