在使用iOS的Size Classes发现了一个坑。
我们先来做个很简单的Demo,storyboard图如下:
我们在
ViewController
视图里放一个button,点击后push到OtherViewController
里,OtherViewController
里有一个tableView, tableView有一个动态cell,cell的顶部有一个红色的UIView。这里我们都用autolayout来做布局。我们运行一下,效果图如下:
我们看到运行很正常。
那假如我们一开始创建的时候就用Size Classes的wCompact-hRegular
类型而非默认的wAny-hAny
。
大家觉得运行效果会跟上面的一样吗?之前我一直认为是一样的,可事实却不是这样的。我们来看下运行效果。
我们可以看到第一个cell的红色视图被导航栏遮挡住了。
我之所以发现这个问题,是我在工作的时候,要做一个动态cell,里面有的视图有时候有,有时候没有。我以前一直的做法是将要隐藏的视图的高度约束改为0,然后用
- (CGSize)systemLayoutSizeFittingSize:(CGSize)targetSize
来自动计算cell的高度。可这次却发现这个方法不会计算高度了,每个cell的高度都返回44。又试了好几次还是不行。
决定把计算高度改为手动计算,不过又发现一个小bug,决定将一些有时候有,有时候没有的视图改为用
Masonry
来手动写约束。这时候又出现问题了,程序一运行到代码写的约束就会崩溃,说找不到两个视图的父视图。然后,我写了一个简单的Demo发现这样写是没有问题的,不知道为什么在我的工程里就会出现问题。浪费了好多时间,为了再次确认,我又重写那个简单的Demo发现这个也会崩溃了,我就百思不得其解,同样的代码,同样的约束,为什么这个就运行不起来呢?
我开始挨个对比这两个Demo,无意间发现我两次Demo的Size Classes的类型不同,我把崩溃的那个Demo也改为wAny-hAny,神奇的事情发生了,以前的问题都消失了。
我现在还不清楚为什么会这样,按理说这两种类型应该都没有问题的。不过事实就是这样,我以后工程里都会用默认的wAny-hAny类型了,暂时不再用其他类型。因为这个问题已经耽误了我好几天时间了,我的时间呀,啊啊啊啊啊啊……
如果有人知道原因可以在下面评论下,告诉我。不胜感激。