滚动视图(UIScrollView
UITableView
UICollectionView
等)都有一个contentInsetAdjustmentBehavior
属性。 这里通过测试,描述一下这个属性的作用。
先说总结
滚动视图在被tabbar遮住的时候,系统默认会修改滚动视图的contentInset
属性,使滚动视图最底部的内容避开tabbar的遮挡。如果用户设置滚动视图的contentInsetAdjustmentBehavior
属性为.never
,则系统不会再做相关处理,滚动视图的最底部内容会被tabbar遮挡。
不过,当contentInsetAdjustmentBehavior
属性为.never
时,开发者可以自己修改contentInset
属性。
但是当contentInsetAdjustmentBehavior
属性为默认值时,开发者自己修改contentInset
属性时,会被系统干预,自动叠加遮挡的部分的高度。
举例说明
首页HomeViewController 有一个tableView视图,HomeViewController显示底部导航栏(Tabbar,系统高度是49)
tableView的布局如下:
self.tableView.frame = self.view.bounds
这时候,tableView的底部是在tabbar的后边的,也就是说tableView是被tabbar挡住的, 但是实际上我们的tableView的内容并没有被遮挡,这是因为系统自动做了处理,设置了tableView的contentInset
属性。
<UIView: 0x10fd23f00; frame = (0 64; 414 672); >
<UITableView: 0x110036c00; frame = (0 0; 414 672);
contentOffset: {0, 0};
contentSize: {414, 1000};
adjustedContentInset: {0, 0, 49, 0}; >
如果此时我们主动设置contentInset
属性会怎么样呢?
self.tableView.contentInset = .init(top: 0, left: 0, bottom: 64, right: 0)
之后底部inset为64后我们再次打印,结果很明显我们设置的64和之前的49叠加了,变成了113:
<UIView: 0x10fd23f00; frame = (0 64; 414 672); >
<UITableView: 0x110036c00; frame = (0 0; 414 672);
contentOffset: {0, 0};
contentSize: {414, 1000};
adjustedContentInset: {0, 0, 113, 0}; >
如果tableView没有被tabbar完全遮挡呢?
self.tableView.height = self.view.height-20
打印结果可以看到,偏移量只是被遮挡住的部分(29=49-20)
<UIView: 0x10fd23f00; frame = (0 64; 414 672); >
<UITableView: 0x110036c00; frame = (0 0; 414 672);
contentOffset: {0, 0};
contentSize: {414, 1000};
adjustedContentInset: {0, 0, 29, 0}; >
如果我们想要自己准确设置contentInset
属性或者就想要tabbar遮挡呢?
我们需要执行:
self.tableView.contentInsetAdjustmentBehavior = .never
执行后:
<UIView: 0x10fd23f00; frame = (0 64; 414 672); >
<UITableView: 0x110036c00; frame = (0 0; 414 672);
contentOffset: {0, 0};
contentSize: {414, 1000};
adjustedContentInset: {0, 0, 0, 0}; >
如果此时我们再次主动设置contentInset
属性会怎么样呢?
self.tableView.contentInsetAdjustmentBehavior = .never
self.tableView.contentInset = .init(top: 0, left: 0, bottom: 64, right: 0)
打印结果:
<UIView: 0x10fd23f00; frame = (0 64; 414 672); >
<UITableView: 0x110036c00; frame = (0 0; 414 672);
contentOffset: {0, 0};
contentSize: {414, 1000};
adjustedContentInset: {0, 0, 64, 0}; >