iOS UITableView 的坑:isDragging 屬性無效

簡要:對于 UITableView、UICollectionView,如果要判斷用戶是否正在拖拽,要使用 isTracking 屬性代替 isDragging 屬性

在 iOS 里,鍵盤彈起之后,如果用戶想讓鍵盤收起,一個常見的做法是當用戶上下劃動一下 tableView 的時候就把鍵盤收起。比如京東商品評論就是這么做的。

上下略微劃動一下頁面,鍵盤就會收起

那么如何實現(xiàn)這個效果呢?最簡單的想法是:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    [self.view endEditing:YES];
}

但這樣寫有一個問題:除了用戶手動地上下劃動,其他原因造成的滾動也會觸發(fā)這個回調(diào)函數(shù)。例如,當鍵盤彈出的時候,為了讓 tableView 的內(nèi)容能完全顯示,往往會將 tableView 的底部 inset 改為鍵盤高度,此時也會觸發(fā)scrollViewDidScroll:事件。如果像上面寫的話,就會導致鍵盤又被收起來了。

所以,我們自然想到用 scrollView 的isDragging屬性來判斷一下滾動的原因,是否是用戶拖拽導致的:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    if (scrollView.isDragging) {
        [self.view endEditing:YES];
    }
}

理論上這樣寫應(yīng)該沒有任何問題,然而實際卻不能用!因為測試發(fā)現(xiàn),即使不是用戶劃動,isDragging屬性也可能為YES。比如上面的例子,由于改變 inset 導致的滾動,用戶并沒有拖拽,然而isDragging屬性仍為YES。

也就是說,isDragging屬性在 UITableView 上是不能用的,它的值并不總是正確,并不能正確反映出用戶是否在拖拽。UICollectionView 也有同樣的問題。

要解決這個問題,我們只能用isTracking代替isDragging。所以改成:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    if (scrollView.isTracking) {
        [self.view endEditing:YES];
    }
}

就沒有問題了。

查了一下蘋果文檔,并沒有相關(guān)的解釋,看來又是官方實現(xiàn)的一個小 bug 了。

p.s. 文中的效果也可以用下面這個方法實現(xiàn):

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
    [self.view endEditing:YES];
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,376評論 4 61
  • G:【心理咨詢中的指導性技術(shù)】通過解釋(附加共情、提供信息、想象、面質(zhì)、自我暴露 1、解釋技術(shù)。加強來訪者的視野,...
    木子青青草閱讀 206評論 0 0
  • 復習消費者行為理論,自己和以前的感悟有所差異。以前,學起來總有些空中樓閣的感覺,難以理解。但這幾年,經(jīng)過研究生的經(jīng)...
    河馬先森閱讀 272評論 0 0

友情鏈接更多精彩內(nèi)容