iOS控制器有导航栏时tableView的位置

一、小知识点

如果将控制器的automaticallyAdjustsScrollViewInsets默认值YES改为为NO,则控制器的view坐标值相对于window。
控制器的navigationController.navigationBar.translucent设置为默认值YES;
上述两者的属性设置意义相同。

当把导航栏隐藏改变时,控制器的view的frame也会改变;

三、下面讨论几种常见的情况

1、控制器的view是tableView时(控制器可能是UITableViewController的子类),无论tableview的frame如何设置,tableview都会自动计算占满整个屏幕,tableView的contentOffset.y为64。前提是控制器的自动调整滚动视图和导航栏的透明属性是默认值。

_tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 64, _SCREEN_WIDTH_, _SCREEN_HEIGHT_-64) style:UITableViewStyleGrouped];
_tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, _SCREEN_WIDTH_, _SCREEN_HEIGHT_) style:UITableViewStyleGrouped];
_tableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStyleGrouped];
//以上三句代码效果一样,感觉Apple吃饱了撑的

_tableView.dataSource = self;
_tableView.delegate = self;
[_tableView registerClass:[XXXCell class] forCellReuseIdentifier:NSStringFromClass([XXXCell class])];
self.view = _tableView;

2、tableview不是控制器view,是控制器view的直接子视图。tableView的contentOffset.y为64。

_tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, _SCREEN_WIDTH_, _SCREEN_HEIGHT_) style:UITableViewStyleGrouped];
_tableView.dataSource = self;
_tableView.delegate = self;
[_tableView registerClass:[XXXCell class] forCellReuseIdentifier:NSStringFromClass([XXXCell class])];
[self.view addSubview:_tableView];

3、tableview是控制器view的直接子视图。不过设置automaticallyAdjustsScrollViewInsets为NO。tableView的contentOffset.y为0。

四、常用

我个人使用这种情况最多。

self.automaticallyAdjustsScrollViewInsets = NO;
_tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 64, _SCREEN_WIDTH_, _SCREEN_HEIGHT_-64) style:UITableViewStyleGrouped];
_tableView.dataSource = self;
_tableView.delegate = self;
[_tableView registerClass:[XXXCell class] forCellReuseIdentifier:NSStringFromClass([XXXCell class])];
[self.view addSubview:_tableView];

你可能感兴趣的:(iOS控制器有导航栏时tableView的位置)