标签: automaticallyAdjustsScrollViewInsets、contentInsetAdjustmentBehavior、translucent
translucent 的作用:
- translucent 是 UINavigationBar 的属性。默认值 iOS 6 之前是NO,iOS 7 之后是YES。表示导航栏是否半透明,但是它还会影响UITableView 的内容呈现位置。
UITableView *tableView = [[UITableView alloc] initWithFrame:[UIScreen mainScreen].bounds style:UITableViewStylePlain];
[self.view addSubview:tableView];
tableView.backgroundColor = [UIColor redColor];
self.navigationController.navigationBar.translucent = YES;
上面这段代码中我们可以看到UI呈现为这样:
- 导航栏半透明
- tableView的frame没有变化,因为半透明导航栏下面的颜色是红色
- 变化的是tableView的显示位置,因为我们看到第一行并没有被遮挡的样子,同样我们看到最后一行的内容被遮挡住了,那么说明整个tableView的显示 Height就是我们赋予的:[UIScreen mainScreen].bounds.size.height
需要特别提醒的是:这里显示的位置变化我们不能查看到是什么属性发生了变化,contentInset,contentOffSet Or contentSize 都不能查看,不论你是断点或者NSLog都是查看不了的。这个其实已经发生了变化的UI,为什么苹果不让我们打印呢?我想或许是害怕我们会不知道有属性发生了变化(不管是contentInset,contentOffSet Or contentSize ),而当我们去重新给已经变化的属性赋值时会掉进这个变化,甚至变化了多少的坑中去。。。
Simulator Screen Shot - iPhone 8 - 2017-10-26 at 20.23.30.png其实操作tableView显示内容位置发生变化的根本原因是UINavigationBar透明度发生了变化。可以去查看官方文档
automaticallyAdjustsScrollViewInsets 和 contentInsetAdjustmentBehavior
- automaticallyAdjustsScrollViewInsets 是 UIViewController 的属性,contentInsetAdjustmentBehavior 是 UITableView 的 属性,iOS 11 之后,后者代替了前者。
他们两很简单,但是很重要,如果你有时候在迷惑有导航的UIViewController (0,0)点到底是状态栏开始还是从导航栏之下开始,那么接下来我将告诉你答案。
- automaticallyAdjustsScrollViewInsets 默认 YES,contentInsetAdjustmentBehavior 默认 UIScrollViewContentInsetAdjustmentAutomatic,表示自动调整UIScrollView的内容显示,也就是说你的布局就是上面那样的。
显示的位置起点是导航栏下,但是内容大小也是[UIScreen mainScreen].bounds ,所以就超出了界面,你的Height就需要减去导航的高度!
UITableView *tableView = [[UITableView alloc] initWithFrame:[UIScreen mainScreen].bounds style:UITableViewStylePlain];
[self.view addSubview:tableView];
tableView.backgroundColor = [UIColor redColor];
if (@available(iOS 11.0, *)) {
tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
} else {
self.automaticallyAdjustsScrollViewInsets = NO;
}
- 当你关掉自动调整显示内容,也就是像上面这样时,你看到的UI是这样的:
我们发现起点从状态栏开始了。所以你以后再也不用这样写了
UITableView *tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, -64, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height) style:UITableViewStylePlain];
[self.view addSubview:tableView];
以后关于UIViewController 起点的问题就不用问了吧。。。总之就是这三个属性去改变了,我不建议调整translucent,默认就行(除非你们的产品固执己见!)。通过automaticallyAdjustsScrollViewInsets、contentInsetAdjustmentBehavior可以让你知道UIViewController中的起点。
网友评论