代碼寫的scrollView,superView是xib寫的view,大家都知道xib里的view調(diào)的子類初始化方法都是init?(coder:),但是在調(diào)用init的時(shí)候是沒有賦值frame的,所以我override了frame,在didSet里做的初始化,大概代碼:
override var frame:CGRect{
? ? ? ?didSet{
? ? ? ? ? ?self.showsHorizontalScrollIndicator=true;
? ? ? ?}
}
再運(yùn)行直接crash,當(dāng)時(shí)很不理解為什么這里會(huì)crash,控制臺(tái)的log是CALayerInvalidGeometry,reason: 'CALayer position contains NaN: [nan nan]'
查了下大概是視圖無(wú)限大導(dǎo)致crash,初步估計(jì)原因是調(diào)用這一句會(huì)讓frame發(fā)生變化,死循環(huán)導(dǎo)致crash,于是打了個(gè)斷點(diǎn),發(fā)現(xiàn)didSet這里其實(shí)也就調(diào)用了一次,然后直接就crash了。
好吧,那我改成false,crash問題是解決了,但是發(fā)現(xiàn)另一個(gè)問題:在frame的set回調(diào)里設(shè)置showsHorizontalScrollIndicator為false根本沒用,文檔上這個(gè)值應(yīng)該默認(rèn)是true,但是我在frame的set回調(diào)里print出來showsHorizontalScrollIndicator這個(gè)值是false,但是當(dāng)我滾動(dòng)的時(shí)候在scrollViewDidScroll(_:)里打出來的showsHorizontalScrollIndicator是true,也就是說UIKit給UIScrollView設(shè)置showsHorizontalScrollIndicator的時(shí)機(jī)是在setFrame之后,所以即使我在frame的set回調(diào)里把showsHorizontalScrollIndicator改成了false,之后UIKit又會(huì)把showsHorizontalScrollIndicator改成默認(rèn)的true。
然后這個(gè)frame的設(shè)置和showsHorizontalScrollIndicator的設(shè)置順序是不是跟他的superView是xib有關(guān)系呢?
我又用代碼寫了個(gè)superView試了一下,結(jié)果一樣。
至于crash問題,由于看不到UIKit代碼,我只能猜想是在設(shè)置showsHorizontalScrollIndicator為true的時(shí)候,里面有修改frame相關(guān)的代碼,但是這些代碼不會(huì)調(diào)外部回調(diào),swift不知道怎么直接重寫setFrame方法,明天用OC試試。