今天被 Xcode 大坑了一把。(我一直认为『重启大法好』,是针对 Windows 系统的,从没想过 Xcode 偶尔也是需要的)
公司支持的最低版本是 iOS10.0,离它发布已经过去 4 年多了,Xcode 12 自带的模拟器都要求支持 iOS14 了。恰好呢,UIStackView
支持自定义间距是在 iOS11 才开始支持的
- (void)setCustomSpacing:(CGFloat)spacing
afterView:(UIView *)arrangedSubview
API_AVAILABLE(ios(11.0),tvos(11.0));
- (CGFloat)customSpacingAfterView:(UIView *)arrangedSubview
API_AVAILABLE(ios(11.0),tvos(11.0));
就这么一个小功能,我却觉得是 UIStackView
最值得使用的地方了,奈何我们得支持更低的 iOS10 啊。在经历了冗长的约束创建,元素之间首尾手动连接、不确定性连接,这样的痛苦让人实在难以忍受了。于是撸起袖子好好研究了下它,终于激动的找到了解决方法,也就是对它进行改造或扩展,用自己的代码实现了自定义间距功能。
终于愉快的用上了 UIStackView,对比了下这两段代码,没有它写了 140 行代码,而用了它之后,代码直降 100 行,还少了很多 if 判断,简直爽的不行。
秉着严谨、提高代码健壮性的态度,我当然要测测它在 iOS10 上的表现如何,结果也很是完美!
我太强了.jpg言归正传
言归正传了,我们的工程第一次运行在 iOS10 上,我就发现了一个小 bug:table view cell 不能根据约束自动撑开了,它的高度固定为 44 了,上面的元素被挤压得看不见(高度为0)、或者图片超出 contentView。
解决办法嘛很简单,稍微查了下发现是 tableView.estimatedRowHeight
没有设置,在 iOS10 系统下,必须要给它设置一个大于0的值,tableViewCell 才会开启自动约束撑开高度的功能。
然而就是这时见了鬼了,这招死活不管用。更诡异的是有三个列表都用了这个特性,有一个列表从头到尾一直好好的,还有两个列表就死活撑不开。区别也就是那个好的列表它设置了估计高度,有问题的列表刚开始没有设置后来设置了。
怎么设置了还是不行?是不是时机不对?我一直围绕着这个属性调试,结果断点调试时遇到了更令人怀疑人生的事
iOSyinan.png
图中第 36 行的断点,如果我什么都不做,就放开让它过去,列表就是坏的,内容撑不开。
但是!!如果我在 lldb 里把这行代码一模一样的执行一下,然后放开断点,神奇的列表...就好了...内容都自动撑开了,动态的高度也没有任何问题。
这就触及到我的知识盲区了,对科学的信仰几乎就要崩塌了,好想找本玄学的书来看看。找来同事结果变成了两个一脸懵逼。
也不知哪根筋突然灵光了,我突然想到我怎么不重启试试,然后,™d问题就这样解决了。
深呼吸.jpg心情平静之后,回想起来,我其实早在调试时就发现了不对劲的征兆。我要告诫自己,下次再遇到什么不对劲,直接果断重启!果断重启!<big>重启!</big>
网友评论