一行程式碼解決UITableView鍵盤收起

穿山甲到底說了什麼發表於2018-12-19

##iOS中常用地收起鍵盤的幾種方式

  • #####新增singleTap單擊手勢
  • #####呼叫API方法

####1.新增singleTap單擊手勢

UITapGestureRecognizer *singleTapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(closeKeyboard:)];
singleTapGesture.numberOfTapsRequired = 1;
singleTapGesture.cancelsTouchesInView = NO;
[tableView addGestureRecognizer:singleTapGesture];

#pragma mark - gesture actions
- (void)closeKeyboard:(UITapGestureRecognizer *)recognizer {
     //在對應的手勢觸發方法裡面讓鍵盤失去焦點    
    [_textField resignFirstResponder];
    //或者使用第二種方法,該方法會一直找到textField或者內嵌的texfield,讓它取消第一響應者
    //[self.view endEditing:YES];
 }
  大家可能會對cancelsTouchesInView這個屬性有所好奇,為什麼要設定成NO,我們通過看其官方API
  A Boolean value affecting whether touches are delivered to a view when a gesture is recognized.
  default is YES. causes touchesCancelled:withEvent: or pressesCancelled:withEvent: 
 to be sent to the view for all touches or presses recognized as part of this gesture immediately before the action method is called.
這句話的意思就是說設定這個值將會影響到手指的觸控事件是否會傳送到新增該手勢的View上在本文中即recongizer.view(tableView)
這樣可能還是不夠清晰,再說清楚一些就是當我們新增一個reconnizer手勢給一個檢視的時候,當前window分發觸控事件的時候,
會先問該手勢有沒有被識別(可以理解為於手勢繫結的action方法有沒有被觸發),當手勢識別成功,就會問cancelsTouchesInView是否為YES,如果設定為YES,
觸控事件就不會繼續分發,那麼tableview的 tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath方法不會觸發,
因為觸控事件被提前結束了!當手勢識別失敗的時候(即沒有被呼叫的時候), window就會繼續把事件傳遞下去給該tableView,因為View也是繼承自UIResponder的,
會立即執行 touchesCancelled:withEvent: or pressesCancelled:withEvent: 到此一個觸控事件迴圈結束!那麼當cancelsTouchesInView設定為NO會發生什麼樣的變化呢?
前面還是不變,當手勢識別成功,就會問cancelsTouchesInView是否為YES,如果設定為NO,觸控事件會繼續傳遞給響應鏈,就不會立即返回,因此還是會呼叫tableView的
tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 還有cell 的按鈕觸發方法,都是不會受到影響的!

換句話說就是cancelsTouchesInView :如果Recognizer分析成功,就會解除View上的繫結的剩餘手勢事件,那麼windows也不會給傳送這寫手勢事件。
windows通過給view傳送touchesCancelled:withEvent:訊息來退出舊事件處理。
複製程式碼

####2.呼叫API方法 tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag; UIScrollViewKeyboardDismissModeNone,//預設第一種,為none UIScrollViewKeyboardDismissModeOnDrag,//鍵盤會當tableView上下滾動的時候自動收起 UIScrollViewKeyboardDismissModeInteractive, // 設定鍵盤的消失方式為拖拉並點選頁面,iOS7新增特性

相關文章