一、小知识点
如果将控制器的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];