1昭雌、在UITableView中使用選擇文本和復(fù)制功能
產(chǎn)生的問(wèn)題:因?yàn)閅YTextView本身也是一個(gè)UIScrollView,所以會(huì)導(dǎo)致手勢(shì)沖突
解決方案:
? ? NotificationCenter.default.addObserver(self,
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? selector:#selector(willShowEditMenu),
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? name: NSNotification.Name.UIMenuControllerWillShowMenu,
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? object:nil)
? ? NotificationCenter.default.addObserver(self,
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? selector:#selector(didHideEditMenu),
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? name: NSNotification.Name.UIMenuControllerDidHideMenu,
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? object:nil)
? ? // 防止復(fù)制時(shí) 滑動(dòng)事件和tableview的沖突 導(dǎo)致復(fù)制錯(cuò)誤
? ? @objc func willShowEditMenu() {
? ? ? ? self.tableView.canCancelContentTouches = false
? ? ? ? self.tableView.delaysContentTouches = false
? ? }
? ? @objc func didHideEditMenu() {
? ? ? ? self.tableView.canCancelContentTouches = true
? ? ? ? self.tableView.delaysContentTouches = true
? ? }
解釋下canCancelContentTouches和delaysContentTouches兩個(gè)屬性
delaysContentTouches和canCancelContentTouches都是scrollView的一個(gè)屬性硫狞,在講這兩個(gè)屬性之前,首先要講下scrollView的一個(gè)機(jī)制。
從你的手指touch屏幕開始残吩,scrollView開始一個(gè)timer财忽,如果:
150ms內(nèi)如果你的手指沒有任何動(dòng)作,消息就會(huì)傳給subView泣侮。
150ms內(nèi)手指有明顯的滑動(dòng)(一個(gè)swipe動(dòng)作)即彪,scrollView就會(huì)滾動(dòng),消息不會(huì)傳給subView活尊。
150ms內(nèi)手指沒有滑動(dòng)隶校,scrollView將消息傳給subView,但是之后手指開始滑動(dòng)蛹锰,scrollView傳送touchesCancelled消息給subView深胳,然后開始滾動(dòng)。
delaysContentTouches:默認(rèn)值為YES铜犬。如果設(shè)置為NO舞终,則會(huì)立即把事件傳遞給subView。
canCancelContentTouches:默認(rèn)為YES癣猾,如果設(shè)置為NO敛劝,這消息一旦傳遞給subView,這scroll事件不會(huì)再發(fā)生煎谍。