代碼寫的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]'
查了下大概是視圖無限大導(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試試执赡。