昨天朋友遇见了个关于Masonry及AutoLayout给ScrollView的子控件布局的小Bug
,朋友自己解决完之后,抛给了我…
出现的Bug表现为:
给ScorllView的子控件(UIView)布局后, 子控件不显示.
环境:
子控件以ScrollView的frame布局. 不设置子控件宽高.
测试:
设置断点打印子控件frame, 发现宽高都为0. 布局改为四个约束,只设置高.
同样不显示. 再次打印, 发现高有值, 而宽为0.
结论:
使用Masonry或AutoLayout布局ScrollView的子控件时必须给子控件指定宽高.
PS: Label类不在上述之内, Label类只要有内容,即可显示.
猜测原因:
也曾猜测为在ViewDidLoad中没有拿到准确的ScrollView的frame,然后在
viewDidAppear中手动调用了layoutIfNeeded也没有效果, 下面是猜测的
原因:
!!!: ScrollView的contentSize是根据子控件的大小自动计算的,
而contentSize即是控件的显示范围, 子控件布局可能也是参照
contentSize的(不确定). 如果是的话, 那么可以解释为: contentSize要
根据子控件来设置, 子控件又要根据contentSize设置.这样就造成
上述Bug.
但是:
我在设置子View之前 手动设置了scrollView的contentSize大小, 发现子控件
依然不会显示.
好奇之下,又在viewDidAppear 中设置了断点(所有工作都已经在ViewDidLoad中
完成), 然后再次打印了子控件及ScrollView, 结果子控件的frame宽高为0, 而
我手动设置的contentSize并没有起作用, 竟然也为0,0..
这一点之前好像看到过解释, 快忘干净了, 先放在这吧....有时间再看看.