1. isUserInteractionEnable問(wèn)題
最常見(jiàn)的是將UIButton addSubview 進(jìn)一個(gè)UIView后UIView的isUserInteractionEnabled是false的
不過(guò)UIView的isUserInteractionEnabled默認(rèn)是true的帚屉,也就是如果在UIButton上面有一個(gè)UIView擋著它的話它也不會(huì)相應(yīng)點(diǎn)擊事件喲
目前發(fā)現(xiàn)UILabel是默認(rèn)false的
let view = UIView()
let button = UIButton()
view.addSubview(button)
view.isUserInteractionEnabled = true
2. target function參數(shù)
target的方法參數(shù)值不對(duì)漾峡,這種情況屬于action找不到合適的target。Swift3中建議使用#selector來(lái)設(shè)置action灰殴,以期望在編譯期能夠發(fā)現(xiàn)這樣的輸漏敬特,感覺(jué)很棒牺陶,然而如果屬于這種參數(shù)類型不對(duì)的,#selector也無(wú)法在編譯期檢測(cè)出來(lái)掰伸。
init(frame:CGRect){
super.init(frame:frame)
let button = UIButton()
button.addTarget(self, action:#selector(self.onButtonClick(sender:)), for UIControlEvents.touchUpInside)
}
func onButtonClick(sender:MyButtonClass){
// do somthing
}
3.superView frame & bounds
UIButton addSuview進(jìn)一個(gè)UIView(或別的UIView的子類中)皱炉,顯式的設(shè)置了UIButton的frame狮鸭,使得UIButton可以正確的在界面上被看到,然而UIView的frame沒(méi)有設(shè)置(這可能是因?yàn)椴磺‘?dāng)?shù)氖褂肧napkit或者其他自動(dòng)布局導(dǎo)致)歧蕉,因此灾部,就算設(shè)置了isUserInteractionEnable后惯退,點(diǎn)擊仍然不能觸發(fā)事件,原因是催跪,點(diǎn)擊事件首先要被UIView接受到锁蠕,然后才能傳給UIButton懊蒸,而UIView的frame可能根本就是一個(gè)CGRectZero,根本沒(méi)有可以點(diǎn)擊的區(qū)域骑丸,因此UIButton也無(wú)法接受到點(diǎn)擊事件舌仍。可以通過(guò)
Xcode的Debug View Hierarchy發(fā)現(xiàn)這個(gè)問(wèn)題抡笼。
3.1:
看似一切正常的頁(yè)面底部點(diǎn)贊按鈕(空心桃心處)
3.2:
選擇桃心按鈕可以看到Button區(qū)域,其中UIButtonInCell是UIButton的子類
3.3:
選擇UIButtonInCell的superView:alltuu.PhotoViewerBottomIconButton,發(fā)現(xiàn)這個(gè)frame在Debug View Hierarchy中看不到
3.4:
查看左側(cè)的視圖瀏覽器推姻,view的結(jié)構(gòu)如下圖
3.5:
發(fā)現(xiàn)alltuu.PhotoViewerBottomIconButton旁邊有一個(gè)紫色的感嘆號(hào),說(shuō)明這里有問(wèn)題藏古,把鼠標(biāo)放在感嘆號(hào)上,提示:width is ambiguous拧晕,也就是提示自動(dòng)布局的約束條件不確定隙姿,因此frame的寬度不確定厂捞,所以frame看不到输玷。
在實(shí)際項(xiàng)目中碰到這類問(wèn)題會(huì)繼續(xù)更新到這里