iOS学习笔记——UIScrollView的坑和填坑

准确的说这个坑不知UIScrollView的,但是是在UIScrollView上表现出来的,所以标题就这么写吧。

昨天学习公开课的UIScrollView课程,在做Demo的时候发生了很诡异的事情。完全按照视频的代码编写Demo,但是到最后UIScrollView显示不出来,微博求助也未果(完成后的正确效果见下面的视频):

屏幕快照 2014-10-10 下午3.38.51

Google了很久,在CocoaChina发现一个和我一样问题的同学(转到),他重新在storyboard中试了一次就ok了。然后重试了好多次仍然没有解决。最后我尝试不使用storyboard,在代码中创建UIScrollView,发现基本能正常显示出来(边距有问题),但是还不知道到底storyboard中哪里有问题。

今天重新解决这个问题,首先使用断点调试查看变量是否为空,然后在生命周期里打点看属性是否正确。打点的时候已经发现在viewDidLoad中UIScrollView的frame和bounds的宽高都是600,在iPhone6的模拟器上,显然是有问题的,但是不知道怎么进一步调试查看了。

在研究Xcode的调试功能的时候,发现了这个按钮(在下面的调试窗口上),真是天无绝人之路!

屏幕快照 2014-10-10 下午3.52.11

点了一下,发现不敢相信自己的眼睛!这个是对UI的调试选项,可以看到UI的层级结构和布局属性,有种以前第一次在Firefox中查看CSS层级效果的感觉。

Xcode调试UI

从中可以看出,UIImageView(就是图片那一层)和UIView(页面顶级View,在UIImageView后面)之间的空隙比较大,没错,这就是消失掉的UIScrollView层!!!

UIScrollView的尺寸和位置属性配置错误,导致没有在界面上显示出来。

坑是AutoLayout挖的。原因是使用AutoLayout的Reset to Suggested Constraints功能时,自动生成的Constraints和课上的不一致——事实上,我多次点击Resetting to Suggested Constraints选项生成的也不一致——也就是Xcode没有正确地设置Constraints!

自动生成的版本之一:

屏幕快照 2014-10-10 下午4.06.56

知道问题原因就可以解决了,也就是手动设置Constraints,更改之后如下:

屏幕快照 2014-10-10 下午4.10.47

修改成这样之后就正常了。

关于Top/Bottom Layout Guide,官方文档的解释是(top):

Indicates the highest vertical extent for your onscreen content, for use with Auto Layout constraints. (read-only)

也就是说这个它是用来限制屏幕内容区域的最高位置,注意这里是最高位置,并没有宽度的含义,所以如上面的自动设置,因为将Leading Alignment和Trailing Alignment都和Top Layout Guide关联,相当于UIScrollView被压缩成没有宽度,自然显示不出来。

修改之后再看一下那个华丽的UI层级效果:

屏幕快照 2014-10-10 下午4.20.32

UIScrollView已经正常显示了,随后就是顺利完成Demo,最终效果:

[embed]http://v.youku.com/v_show/id_XODAwNTMzNzEy.html[/embed]

总结下这个填坑的过程:

  • 问题、困难都不用担心,人总是在跌倒中成长的。
  • 出现问题除了解决掉,还要找原因,只有找到原因,才能正确的解决。
  • Xcode对UI的调试真心绚丽,想想Android的View Hierarchy,咳咳,好多人都没用过其实。

    什么事情,遇到磕磕绊绊都不可怕,只要冷静看待,理智分析,坚持正确的点,总会找到最合适的解决方法。
    那么,问题来了……