showsHorizontalScrollIndicator设置为true导致crash的问题

代码写的scrollView,superView是xib写的view,大家都知道xib里的view调的子类初始化方法都是init?(coder:),但是在调用init的时候是没有赋值frame的,所以我override了frame,在didSet里做的初始化,大概代码:

override var frame:CGRect{

       didSet{

           self.showsHorizontalScrollIndicator=true;

       }

}

再运行直接crash,当时很不理解为什么这里会crash,控制台的log是CALayerInvalidGeometry,reason: 'CALayer position contains NaN: [nan nan]'

查了下大概是视图无限大导致crash,初步估计原因是调用这一句会让frame发生变化,死循环导致crash,于是打了个断点,发现didSet这里其实也就调用了一次,然后直接就crash了。

好吧,那我改成false,crash问题是解决了,但是发现另一个问题:在frame的set回调里设置showsHorizontalScrollIndicator为false根本没用,文档上这个值应该默认是true,但是我在frame的set回调里print出来showsHorizontalScrollIndicator这个值是false,但是当我滚动的时候在scrollViewDidScroll(_:)里打出来的showsHorizontalScrollIndicator是true,也就是说UIKit给UIScrollView设置showsHorizontalScrollIndicator的时机是在setFrame之后,所以即使我在frame的set回调里把showsHorizontalScrollIndicator改成了false,之后UIKit又会把showsHorizontalScrollIndicator改成默认的true。

然后这个frame的设置和showsHorizontalScrollIndicator的设置顺序是不是跟他的superView是xib有关系呢?

我又用代码写了个superView试了一下,结果一样。

至于crash问题,由于看不到UIKit代码,我只能猜想是在设置showsHorizontalScrollIndicator为true的时候,里面有修改frame相关的代码,但是这些代码不会调外部回调,swift不知道怎么直接重写setFrame方法,明天用OC试试。

你可能感兴趣的:(showsHorizontalScrollIndicator设置为true导致crash的问题)