隐藏导航栏时添加在self.view上的Tableview位置产生20个单位的误差

也许你已经发现了,当你隐藏了页面中的导航栏,并且在self.view上添加了一个tableview时,你的tableview的位置会向下偏20个单位,并且你怎么找都找不到问题所在。。。因为这就不是你的问题。

你会发现在ios7.1及以上的系统下都会存在这个bug(7.1版本以下我没有试过,可以自己试试),解决办法就是不要直接把你的tableview加在self.view上,而是先要在self.view上放上一个任意的子视图,再将tableview添加在self.view上,这样tableview就不是self.view的第一子视图了。归结为一句话就是滚动视图不能作为父视图的第一子视图。

产生bug的代码如下:

- (void)viewDidLoad {
    [super viewDidLoad];

    //只有当隐藏了导航栏才会出现这个bug,如果导航栏是显示的,则没有任何问题
    [self.navigationController setNavigationBarHidden:YES];
    self.view.backgroundColor = [UIColor greenColor];

    UITableView * tableview = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height) style:UITableViewStylePlain];
    tableview.backgroundColor = [UIColor greenColor];
    tableview.delegate = self;
    tableview.dataSource = self;
    [self.view addSubview:tableview];
}

运行结果如下:
隐藏导航栏时添加在self.view上的Tableview位置产生20个单位的误差_第1张图片

添加任意子视图的代码如下:

- (void)viewDidLoad {
    [super viewDidLoad];

    //只有当隐藏了导航栏才会出现这个bug,如果导航栏是显示的,则没有任何问题
    [self.navigationController setNavigationBarHidden:YES];
    self.view.backgroundColor = [UIColor greenColor];

    //在self.view上添加子视图
    UIView * view = [[UIView alloc] initWithFrame:CGRectZero];
    [self.view addSubview:view];

    UITableView * tableview = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height) style:UITableViewStylePlain];
    tableview.backgroundColor = [UIColor greenColor];
    tableview.delegate = self;
    tableview.dataSource = self;
    [self.view addSubview:tableview];
}

运行结果如下:
隐藏导航栏时添加在self.view上的Tableview位置产生20个单位的误差_第2张图片

可以看到tableview已经能够正常显示了。

你可能感兴趣的:(技术博客)