收起鍵盤的幾種方法

在項目中戒洼,經(jīng)常會用到文字輸入框(UITextField蒸播、UITextView)歇由。當用戶點擊他們會自動彈出鍵盤(注意:在模擬器上不會彈出),但是用戶輸入完成之后瓮栗,收起鍵盤的操作卻需要去監(jiān)聽用戶的操作并通過回調(diào)實現(xiàn)削罩。這里我總結(jié)幾個常用的收起鍵盤的方法。

首先要讓存放輸入框的類聲明的UITextField代理協(xié)議费奸,這里是直接放在一個ViewController上:

@interface TestViewController ()<UITextFieldDelegate>

我們按住Command點擊UITextFieldDelegate進去查看這個協(xié)議的方法鲸郊,發(fā)現(xiàn)協(xié)議需要實現(xiàn)的方法都是可選的。

protocol UITextFieldDelegate <NSObject>
@optional
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField;        // return NO to disallow editing.
- (void)textFieldDidBeginEditing:(UITextField *)textField;           // became first responder
- (BOOL)textFieldShouldEndEditing:(UITextField *)textField;          // return YES to allow editing to stop and to resign first responder status. NO to disallow the editing session to end
- (void)textFieldDidEndEditing:(UITextField *)textField;             // may be called if forced even if shouldEndEditing returns NO (e.g. view removed from window) or endEditing:YES called
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string;   // return NO to not change text
- (BOOL)textFieldShouldClear:(UITextField *)textField;               // called when clear button pressed. return NO to ignore (no notifications)
- (BOOL)textFieldShouldReturn:(UITextField *)textField;              // called when 'return' key pressed. return NO to ignore.
@end

為了方便货邓,我們把UITextField設(shè)置成屬性秆撮。

@property (nonatomic, strong) UITextField *testField;

創(chuàng)建一個UITextField:

_testField = [UITextField new];
[_testField setFrame:CGRectMake(50, self.view.frame.size.height*0.5, self.view.frame.size.width-100, 30)];
_testField.delegate = self;
_testField.backgroundColor = [UIColor grayColor];
_testField.placeholder = @"請在此輸入文字";
_testField.returnKeyType = UIReturnKeyDone;
[self.view addSubview:_testField];

收起鍵盤之方法一:通過UITextFieldDelegate協(xié)議監(jiān)聽鍵盤的return按鈕時都被點擊收回鍵盤。

我們按住Commond鍵點擊returnKeyType换况,進去會看到returnKeyType是一個枚舉類型职辨,也就是鍵盤上的返回按鈕的類型盗蟆。

typedef NS_ENUM(NSInteger, UIReturnKeyType) {
    UIReturnKeyDefault,
    UIReturnKeyGo,
    UIReturnKeyGoogle,
    UIReturnKeyJoin,
    UIReturnKeyNext,
    UIReturnKeyRoute,
    UIReturnKeySearch,
    UIReturnKeySend,
    UIReturnKeyYahoo,
    UIReturnKeyDone,
    UIReturnKeyEmergencyCall,
    UIReturnKeyContinue NS_ENUM_AVAILABLE_IOS(9_0),
};

這里的returnKeyType設(shè)置類型,只會影響鍵盤上turnkey位置將顯示的文字舒裤,如UIReturnKeyDefault顯示“換行”喳资,UIReturnKeyGo顯示“前往”,UIReturnKeyGoogle顯示“搜索”腾供,UIReturnKeyDone顯示“完成”仆邓。而它的實際點擊效果需要在UITextFieldDelegate的代理方法里面去實現(xiàn)。這里需要實現(xiàn)的是如下方法:

- (BOOL)textFieldShouldReturn:(UITextField *)textField;

具體實現(xiàn)方法如下:

-(BOOL)textFieldShouldReturn:(UITextField *)textField {
    [_testField resignFirstResponder];
    return YES;
}

收起鍵盤之方法二:點擊鍵盤背景伴鳖,通過監(jiān)聽視圖的觸摸事件來收回鍵盤节值。

觸摸的對象是視圖,而視圖的類UIView繼承了UIRespnder類搞疗,但是要對事件作出處理,還需要重寫UIResponder類中定義的事件處理函數(shù)须肆。根據(jù)不通的觸摸狀態(tài)匿乃,程序會調(diào)用相應的處理函數(shù),這些函數(shù)包括以下幾個:

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event;
- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event;
- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event;
- (void)touchesCancelled:(nullable NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event;
- (void)touchesEstimatedPropertiesUpdated:(NSSet * _Nonnull)touches NS_AVAILABLE_IOS(9_1);

這是實現(xiàn)父類的方法豌汇,我們只需用其中的:
- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event;
具體的實現(xiàn)如下:
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
if (![_testField isExclusiveTouch]) {
[_testField resignFirstResponder];
}
}

isExclusiveTouch 決定當前視圖是否是處理觸摸事件的唯一對象,默認值是0幢炸;

收起鍵盤之方法三:點擊鍵盤背景,通過監(jiān)聽手勢UITapGestureRecognizer來收回鍵盤拒贱。

UIKit中包含了UIGestureRecognizer類宛徊,用于檢測發(fā)生在設(shè)備中的手勢。UIGestureRecognizer是一個抽象類柜思,定義了所有手勢的基本行為岩调,它有下面一些子類用于處理具體的手勢:

1巷燥、拍擊UITapGestureRecognizer (任意次數(shù)的拍擊)  
2赡盘、向里或向外捏UIPinchGestureRecognizer (用于縮放)  
3、搖動或者拖拽UIPanGestureRecognizer  
4缰揪、滑動UISwipeGestureRecognizer (以任意方向)  
5陨享、旋轉(zhuǎn)UIRotationGestureRecognizer (手指朝相反方向移動)  
6、長按UILongPressGestureRecognizer 

對于不同類型的手勢識別器钝腺,具有不同的配置屬性抛姑。比如UITapGestureRecognizer,可以配置拍擊次數(shù)艳狐。界面接收到手勢之后定硝,可以發(fā)送一 個消息,用于處理響應手勢動作后的任務毫目。當然蔬啡,不同的手勢識別器诲侮,發(fā)送的消息方法也會有所不同。

我們這里主要用其中的UITapGestureRecognizer箱蟆。
創(chuàng)建一個UITapGestureRecognizer:

UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(keyboardHide:)];
//設(shè)置成NO表示當前控件響應后會傳播到其他控件上沟绪,默認為YES。
tapGestureRecognizer.cancelsTouchesInView = NO;
//將觸摸事件添加到view上
[self.view addGestureRecognizer:tapGestureRecognizer];

添加響應手勢的任務:

-(void)keyboardHide:(UITapGestureRecognizer*)tap{
    [_testField resignFirstResponder];
}

收起鍵盤之方法四:如果輸入框的是處于UIScrollView空猜、或UITableView中绽慈,還可以通過實現(xiàn)UIScrollViewDelegate協(xié)議,監(jiān)聽用戶的滑動操作并收起鍵盤辈毯。

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView

上面的方法坝疼,有一個問題:就是必須找到_testField對象,并且向它發(fā)送resignFirstResponder消息漓摩。 有方法可以不需要找到對象裙士,直接執(zhí)行收回鍵盤的操作,用下面的替換resignFirstResponder:

  [[[UIApplication sharedApplication] keyWindow] endEditing:YES];

或者:

 [[UIApplication sharedApplication] sendAction:@selector(resignFirstResponder) to:nil from:nil forEvent:nil];
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末管毙,一起剝皮案震驚了整個濱河市腿椎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌夭咬,老刑警劉巖啃炸,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異卓舵,居然都是意外死亡南用,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進店門掏湾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來裹虫,“玉大人,你說我怎么就攤上這事融击≈” “怎么了?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵尊浪,是天一觀的道長匣屡。 經(jīng)常有香客問我,道長拇涤,這世上最難降的妖魔是什么捣作? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮鹅士,結(jié)果婚禮上券躁,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好也拜,可當我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布旭贬。 她就那樣靜靜地躺著,像睡著了一般搪泳。 火紅的嫁衣襯著肌膚如雪稀轨。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天岸军,我揣著相機與錄音奋刽,去河邊找鬼。 笑死艰赞,一個胖子當著我的面吹牛佣谐,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播方妖,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼狭魂,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了党觅?” 一聲冷哼從身側(cè)響起雌澄,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎杯瞻,沒想到半個月后镐牺,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡魁莉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年睬涧,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片旗唁。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡畦浓,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出检疫,到底是詐尸還是另有隱情讶请,我是刑警寧澤,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布电谣,位于F島的核電站秽梅,受9級特大地震影響抹蚀,放射性物質(zhì)發(fā)生泄漏剿牺。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一环壤、第九天 我趴在偏房一處隱蔽的房頂上張望晒来。 院中可真熱鬧,春花似錦郑现、人聲如沸湃崩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽攒读。三九已至朵诫,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間薄扁,已是汗流浹背剪返。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留邓梅,地道東北人脱盲。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像日缨,于是被迫代替她去往敵國和親钱反。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,901評論 2 355

推薦閱讀更多精彩內(nèi)容

  • [self.textField resignFirstResponder]; [self.view endEdit...
    JasonEVA閱讀 346評論 0 0
  • 在使用UITextField編輯的時候都會跟鍵盤打交道匣距。 (模擬器打開鍵盤的快捷鍵是 command + k) ...
    灰衣閱讀 628評論 0 0
  • 關(guān)注倉庫面哥,及時獲得更新:iOS-Source-Code-AnalyzeFollow: Draveness · Gi...
    Draveness閱讀 7,213評論 13 72
  • 林沖雖稱之為好漢,但他卻并不是一個好漢毅待,是一個自私幢竹、孺弱的人。因此在我眼里他不是一個英雄恩静,不是一個好漢焕毫。 ...
    樊書寧閱讀 374評論 0 1
  • 緣分,是個什么東西驶乾?或許很多人跟你說過:“對不起邑飒,我們沒有緣分〖独郑”可你還是不懂疙咸。緣分吶,它就是一個借口风科。被甩的時候...
    賀司閱讀 128評論 0 0