附下面几张图有助于理解tableView的内容视图和其相应属性的一些关系:
首先要理解一些概念
- 可视化视图是我们能看见的,内容视图是我们看不见的,默认情况下内容视图的左上角和控件的可视化视图的左上角是保持一致的,内容视图可以理解是无限大的,默认情况下坐标系的原点是和控件的左上角坐标系原点一直的,当然我们也可以自己改变内容视图的原点位置(让内容视图的和控件的不一致)
frame是以父控件的内容视图的左上角为原点的,而bounds是以自己的左上角为原点的(bounds, x,y永远是0),默认情况下的内容视图的原点是和控件的可视化视图的左上角原点重合的(frame和bounds都适用),center也是以父控件的内容视图的左上角为原点的
注意:一定要区别清楚frame,bounds,center的参考系
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
UIView *redView = [[UIView alloc] init];
redView.frame = CGRectMake(50, 50, 200, 200);
redView.backgroundColor = [UIColor redColor];
[self.view addSubview:redView];
_redView = redView;
UISwitch *switchView = [[UISwitch alloc] init];
[_redView addSubview:switchView];
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{//在这个方法中修改了redView自己内容视图坐标原点的y值
CGRect bounds = _redView.bounds;
bounds.origin.y += 10;
_redView.bounds = bounds;
}
- UIViewController和UITableViewController的view是有区别的,区别之一在于他们的frame,UITableViewController的view是在状态条的下面,而UIViewController的view的frame则包括了状态条,但状态条并不是它的子控件
UITableView进阶注意点
UITableView的高度是由其内容决定的(可以理解是内容视图,注意和可视化视图区分),UITableView的内容视图的组成部分包括了UITableviewCell、tableView的tableFooterView和tableHeaderView,当我们将一个控件添加到tableView上面的时候,其实是将其添加到tableView的内容视图的上面,因为当一个控件添加到父控件上的时候我们看到的可视化区域是由该控件的frame决定的,而frame前面已经提到了,它的参考系是以父控件的内容视图的左上角为原点的,也就是添加的子控件是在以内容视图的左上角为原点的参考系中,因此若我们改变了tableView的内容视图的,子控件会随着内容视图的变化而变化.
内容视图有几个属性contentInset,contentOffset,contentSize等等,这些属性都是作用在内容视图上面的,例如contentSize指的就是内容视图的尺寸(宽、高),contentInset指的就是内容视图的周边的间距(内边距),contentOffset指的就是内容视图的偏移量(注意是tableView的frame的坐标 - tableView内容视图的左上角坐标, contentInset则是tableView内容视图的各个边缘,距离tableView的最大正常间距,超过最大正常间距将会自动回到最大正常间距的位置)
注意:将一个子控件添加到父控件中,那么子控件就成为父控件的内容视图的一部分了