最近有個需求需要做一個聊天功能,界面功能都已經(jīng)搭建好,開始慢慢的優(yōu)化用戶體驗。其中有個最簡單的需求:點擊輸入框-->鍵盤顯示,tableView上移;用戶滑動tableView,鍵盤隱藏,tableView下移。
最初覺得這個需求非常簡單,監(jiān)聽UIKeyboardWillShowNotification和UIKeyboardWillHideNotification通知上移或下移tableView。再實現(xiàn)tableView的代理方法:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
[self.view endEditing:YES];
}
在tableView滑動時停止輸入不就好了。寫完之后一運行才發(fā)現(xiàn)不是那回事。
scrollViewDidScroll:這個方法不僅在用戶滑動時響應(yīng)。當(dāng)鍵盤顯示過程中,tableView上移,結(jié)果也調(diào)用了這個方法,鍵盤立即又隱藏了。
無奈之下我又加了個判斷BOOL isShowingKeyBoard,又監(jiān)聽了UIKeyboardDidShowNotification通知,scrollViewDidScroll方法改成了這樣:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
if(! isShowingKeyBoard)
{
[self.view endEditing:YES];
}
}
另外凡是需要代碼滑動tableView的情況,animation全部設(shè)置為NO,總算是暫時解決了這個問題。
可惜千算萬算沒算到在鍵盤顯示后,切換鍵盤輸入方式竟然也會導(dǎo)致tableView自己滑動,調(diào)用scrollViewDidScroll代理方法。這下算是沒轍了,只能另想辦法。
最開始考慮使用監(jiān)聽tableView的touch事件,不過這樣有點麻煩還要寫個繼承類,后來想起UIGestureRecognizer有個代理方法可以間接實現(xiàn)這個需求:
- (BOOL)gestureRecognizer:(UIGestureRecognizer*)gestureRecognizer
shouldReceiveTouch:(UITouch *)touch
{
[self.view endEditing:YES];
return NO;
}
最終給tableView添加了一個滑動手勢UIPanGestureRecognizer,實現(xiàn)上述代理方法,刪除了上面的scrollViewDidScroll方法,確實非常管用,值得記錄。
之所以這個方法這么管用,還在于只要是用戶滑動tableView一定會調(diào)用這個方法,先直接隱藏鍵盤,再返回NO表示不響應(yīng)用戶的操作。這樣用戶的touch事件還是會交給tableView自己的panGesture去響應(yīng)。