前提:
1.控制器的view是默认占据整个屏幕
2.scrollview默认位置大小都为0,要占据整个屏幕,frame应该等于self.view.bounds
3.这里的scrollview既指普通的scrollview也指tableview
4.主要分析scrollview上面加多个tableview的结构
原则:
1.scrollview或者tableview一旦占据了整个屏幕,如果前面有导航条,系统会自动设置一个64的内边距,将内容视图下调64,内容位置发生变化
2.就算scrollview身上已经加了一个tableview,手动设置frame为全屏,这个tableview也会随着内容视图的改变而改变,因为tableview实质上是加到内容视图上的,也就是说系统不管你有没有手动设置子视图的frame,它是自动话判定,一遇到这种情况,就会自动调整
3.这样的调整是当前控制器对象内部通过一个属性自动调整scrolllview的内边距automaticallyAdjustsScrollViewInsets=YES进行调整的,注意这个属性是控制器对象的,而不是scrollview或者tableview的
调整后的优点与缺点:
优点:scrollview中的内容不再被导航条挡住
缺点:如果在scrollview上加了tableview后,tableview就会被压缩区域,内容的上下滚动,只能在限定的区域内移动,无法穿透整个导航条
注意:这里是讨论控制器view上加了scrollview,scrollview上右加了tableview,下调64,导致tableview随着下调,从而cell无法穿过导航栏,如果只是在控制器view上加了tableview,就不需要考虑这种情况
取消自动调整:
如何取消系统对scrollview或者tableview的自动调整呢?
self.automaticallyAdjustsScrollViewInsets = NO
此时内边距为0,这样tableview就可以设置frame占据整个屏幕,不会发生变化,cell也能通过导航栏
必须设置它的frame
如何设置frame呢?
y为0,宽高均为scrollview的宽高