项目在iOS11上运行正常,出问题的手机系统10.3.3。
运行项目就会直接崩溃到main.m中,错误信息显示(+[CATransaction synchronize] called within transaction)
在网上查到的资料都说报错是xib或者storyboard的错误:有IBoutlet的变量未连接
但我是纯代码项目,所以不可能是xib或者storyboard的错误。
之后找到一个提问(https://segmentfault.com/q/1010000003725877/a-1020000003739513),提问中当方法写在自己创建的主线程中时,虽然不会崩溃掉,但是页面没有反应,也就是页面事件被阻塞掉了。如果不加到主线程里面就会崩溃,报错误信息(+[CATransaction synchronize] called within transaction)。
看到这个提问的问题,我就想到我的问题应该是出在主线程UI上,某个地方的代码阻塞了运行。我就在首页添加了断点,最后发现当走UITableView 设置默认段头段尾高度的时候崩溃了。
在ios11中 如果不设置默认段头段尾高度,你会发现当你调用(- (void)scrollToRowAtIndexPath:(NSIndexPath *)indexPath atScrollPosition:(UITableViewScrollPosition)scrollPosition animated:(BOOL)animated;)方法回到顶部的时候不会成功。
虽然段头段尾高度的设置方法7.0就已经提供了,但是我的问题就崩溃到这里了,我也是很忧桑。
解决方法:
if (@available(iOS 11.0, *)){
[[UIScrollView appearance] setContentInsetAdjustmentBehavior:UIScrollViewContentInsetAdjustmentAlways];
[[UITableView appearance] setEstimatedSectionFooterHeight:0.01];
[[UITableView appearance] setEstimatedSectionHeaderHeight:0.01];
}
添加这个判断就可以正常运行。