问题
在使用yoga来布局一个可滑动界面时, 会使用到scrollView. 按着正常的流程布局下来:
1. 创建scrollview
2. 往scrollview中添加contentView
3. 在contentView中添加内容
4. 根视图调用 applyLayoutPreservingOrigin: 方法
5. 将contentView的frame值的size赋值给scrollview的contentSize
scrollView.contentSize = contentView.frame.size
6. 在控制器的 viewWillLayoutSubviews 方法中 再次书写yoga布局的根视图的布局, 再次调用 applyLayoutPreservingOrigin: 方法. 这样写的目地是当屏幕旋转时, 仍可以布局正确
问题在于: 在第6步的时候 在调用 applyLayoutPreservingOrigin: 时, 会发生崩溃.
问题根源
框架的bug
在做布局计算时, 没有正确的将不属于yoga布局的子控件排除在外. 导致设置frame时 frame值为{0, 0, NaN, NaN}.
崩溃原因
我们在 viewWillLayoutSubviews 方法中 再次计算布局时, 由于scrollView控件中隐藏有 水平/垂直 滑块控件 ScrollIndicator 而yoga在计算布局时, 没有将这两个控件排除在外, 导致设置他们的frame值时, 出错了. (为什么我们在viewDidLoad中布局的时候没有崩溃? 因为那时候, 滑块控件还没有创建出来. 懒加载)
解决方法
在yoga仓库中, 已经有一个国内的哥们发现并解决了这个问题
不过在这个bug还未及时在cocoaPod中更新(目前最新版本是1.18.1).
因此只能在yoga仓库中下载最新的代码了
网友评论