PDF 课件和源代码下载地址:
作者回复: 整体的原因就是因为UIScrollViewContentInsetAdjustmentBehavior这个属性。 在项目中我们没有设置,默认系统会在addsubview之后,就是scrollView展示之前自动的调整Inset,导致了offset的变化,所以初始化的时候,其实整体的页面是下移的。 设置了pagingEnabled,系统会自动的处理offset来实现分页的效果.所以对于垂直方向,所以这种自动处理在滑动时会导致之前变化的offset回滚到0。所以就有了上移,而不设置pagingEnabled时系统不会自动调整offset,完全由用户操作,所以就不会出现这种现象。 解决的办法就是设置scrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever。在日常frame布局的项目中,所有的scrollView也都设置了这个属性。相关的知识因为在之后的课程中会进行讲解,所以在当前的项目中,没有设置这个属性。
作者回复: view的bounds,scrollview的bounds是相同的,同时scrollview 中 contentsize的height也是和view/scrollView height相同,比如iphoneXR中,都是896. 为什么会出现滚动条呢?在课程中也讲过,对于一个滚动视图来说,影响滚动的不光有contentSize,还有contentInset。所以我们可以在视图加载完成之后选择合适的时机增加断点,可以发现scrollView的contentInset是有值的。那么为什么我们没有设置contentInset,它自动就有值了?是因为在iOS11之后,系统增加了contentInsetAdjustmentBehavior这个属性,默认是UIScrollViewContentInsetAdjustmentAutomatic,他会根据当前的页面结构(比如在navigation controller中)自动的设置contentInset来进行适配。当然这个属性在使用frame布局的项目中会造成一定的迷惑,所以可以手动的设置该属性为UIScrollViewContentInsetAdjustmentNever,这样就和我们设置frame时候的预期相同了。可以增加这个属性之后,结合断点在看下~
作者回复: 加油!
作者回复: frame是相对于父View坐标系下的位置,而bounds是相对于自己坐标系的位置。简单的说就是对于size来说,两者是一样的,而对于origin ,frame是这个view在superView的位置,而bounds一般来说是origin是{0,0}
作者回复: 具体可以看下https://gcc.gnu.org/onlinedocs/gcc/Statement-Exprs.html 哈。其实也可以不用纠结,就是一个书写的方式而已,在代码较多的时候会显得整洁一些。
作者回复: 可以简单的debug下,contentSize横向是否可以滚动?showsHorizontalScrollIndicator是否有正确的设置?是否能看到scrollview的底部没有被遮挡?如果还是没有找到问题的愿意,建议发下代码的地址哈,我帮你看下