刚刚写了一个demo,自定义了一个UIView,里面添加了一个UIScrollView,UIScrollView的子控件是UIButton,Button的y轴是从Scrollview的0开始的,然后我设置了Scrollview的contentSize的高度为Scrollview的高度,这样得出的效果是支持横向滑动,竖向静止。但是运行之后,得到的实际效果却是按钮往下移动了64个像素,而整个Scrollview还支持竖向滑动,看到这个效果,我还以为是自己的代码出问题了,赶紧检查一下坐标的设置,然而并没有什么毛病,这就奇怪了,为什么会有这样的情况出现呢?
思索了半天,不知何故,就厚着脸皮去问了下两位污神同事,结果他们跟我说只要设置一下UIViewController的automaticallyAdjustsScrollViewInsets这个属性为NO就可以了。当然,我并不知道这个属性是干什么用的,于是问了下度娘,解释大致是:如果UIViewController里面最上边的控件是UIScrollView或其子类View,那么它会自动设置相应的内边距,这样就可以让Scrollview占据整个视图,又不会被导航栏遮盖,所以按钮才会往下偏移了64个像素。我设置完这个属性之后,效果真的出来了,果然iOS的坑不少。
本着探索的精神,我在UIViewController的顶部分别添加了一个UIImageView和UIScrollView测试,将上述的属性去掉,果然效果也出来了,由此可见这个属性的使用时机就如度娘所说,当视图顶部只有一个控件,且控件是UIScrollView及其子类时,需要将他的内边距属性设置为NO,这样就不会出现控件往下移动的奇葩现象了。PS:刚试了一下,其他控件添加在Scrollview的底部,不设置automaticallyAdjustsScrollViewInsets为NO,Scrollview的子控件还是会往下偏移64个像素的,所以最关键的问题出现在Scrollview的位置是在哪里,若顶部无其他控件,则需要设置内边距属性,否则不设置也不会有问题。