代码写的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试试。