簡要:對于 UITableView甩骏、UICollectionView阿逃,如果要判斷用戶是否正在拖拽逸绎,要使用
isTracking
屬性代替isDragging
屬性
在 iOS 里,鍵盤彈起之后淆游,如果用戶想讓鍵盤收起氢惋,一個常見的做法是當(dāng)用戶上下劃動一下 tableView 的時候就把鍵盤收起。比如京東商品評論就是這么做的稽犁。
那么如何實現(xiàn)這個效果呢?最簡單的想法是:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
[self.view endEditing:YES];
}
但這樣寫有一個問題:除了用戶手動地上下劃動已亥,其他原因造成的滾動也會觸發(fā)這個回調(diào)函數(shù)熊赖。例如,當(dāng)鍵盤彈出的時候虑椎,為了讓 tableView 的內(nèi)容能完全顯示震鹉,往往會將 tableView 的底部 inset 改為鍵盤高度,此時也會觸發(fā)scrollViewDidScroll:
事件捆姜。如果像上面寫的話传趾,就會導(dǎo)致鍵盤又被收起來了。
所以泥技,我們自然想到用 scrollView 的isDragging
屬性來判斷一下滾動的原因浆兰,是否是用戶拖拽導(dǎo)致的:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
if (scrollView.isDragging) {
[self.view endEditing:YES];
}
}
理論上這樣寫應(yīng)該沒有任何問題,然而實際卻不能用!因為測試發(fā)現(xiàn)簸呈,即使不是用戶劃動榕订,isDragging
屬性也可能為YES
。比如上面的例子蜕便,由于改變 inset 導(dǎo)致的滾動劫恒,用戶并沒有拖拽,然而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];
}