亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

iOS項目開發鍵盤彈出遮擋輸入框問題解決方案

2020-07-26 02:31:03
字體:
來源:轉載
供稿:網友

在iOS或Android等移動端開發過程中,經常遇到很多需要我們輸入信息的情況,例如登錄時要輸入賬號密碼、查詢時要輸入查詢信息、注冊或申請時需要填寫一些信息等都是通過我們鍵盤來進行輸入的,在iOS開發過程中,一般用于進行輸入信息的有兩類:UITextField和UITextView,前者是單行輸入文本框,后者是可滑動的多行輸入文本框,在這整個開發過程中,我們需要控制鍵盤的彈出和收起、在輸入結束的時候獲取輸入的信息,此外,我們還需要保證在鍵盤彈起的時候不遮擋我們輸入的文本框。今天,我們就主要來說一下文本框輸入的完整響應過程以及最后這個遮擋問題的解決方案。

一 文本框輸入完整的響應過程

首先,我們要對UITextField和UITextView的輸入輸出進行控制,需要借助其對應的代理協議UITextFieldDelegate或UITextViewDelegate中的一些方法,兩者在控制文本框中的相應流程稍有差別,但是都差不多,接下來,我們就從官方文檔中開學習一下文本框輸入完整的響應過程。在UITextFieldDelegate的官方文檔中解釋道:我們可以通過代理中的一些方法實現UITextField對鍵盤的調用,從而實現和用戶進行交互的方法,此外,還可控制UITextField的輸入過程。UITextField的整個輸入過程分為如下7個步驟(如下過程,textfield換成textView即是TextView的響應過程):

在成為第一響應者之前,文本框調用其代理的 textFieldShouldBeginEditing: 方法來允許或阻止其第一響應者,并控制是否對文本框進行輸入

成為第一響應者,對應的相應事件就是系統調用鍵盤(自動彈出),并且系統會根據需要發出UIKeyboardWillShowNotification 和UIKeyboardDidShowNotification的Notification通知,而如果此時系統中有其他的輸入視圖是可視的,則系統會發出 UIKeyboardWillChangeFrameNotification和UIKeyboardDidChangeFrameNotification的通知

系統調用代理的 textFieldDidBeginEditing: 方法,并且發出UITextFieldTextDidBeginEditingNotification的通知,此時光標已經在text field中定位了,鍵盤也已經彈出來了,接下來可以進行輸入了

在輸入信息過程中,當前文本內容改變就會調用 textField:shouldChangeCharactersInRange:replacementString: 方法,并且會發出UITextFieldTextDidChangeNotification的通知。此外,當用戶點擊【clear/清除】按鍵時調用 textFieldShouldClear: 方法清除內容,當用戶點擊【return/完成】按鍵時調用 textFieldShouldReturn: 方法,注意:UITextViewDelegate沒有對應清除和完成方法,所以我們不能調用 textFieldShouldClear: 方法和 textFieldShouldReturn: 方法實現【clear/清除】和【return/完成】按鍵的效果

在文本框輸入即將結束,即即將注銷第一響應者時,系統會調用 textFieldShouldEndEditing: 方法

文本框注銷第一響應者,對應的響應時間就是系統收回鍵盤,并且在隱藏鍵盤時會發出 UIKeyboardWillHideNotification和UIKeyboardDidHideNotification的通知

最后,系統調用 textFieldDidEndEditing: 方法結束輸入,并發出UITextFieldTextDidEndEditingNotification的通知。

二 鍵盤的彈出與收起

2.1 彈出鍵盤的控制  

關于鍵盤的彈出與收起問題,從上面的響應過程分析可知,鍵盤的彈出對于UITextField和UITextView都是自動彈出的,所以我們無需進行控制。如果需要進行控制,我們知道其實在彈出之前是調用了UITextFieldDelegate或UITextViewDelegate的以下方法來控制是否使當前文本框設置為第一響應者( becoming the first responder),文本框成為第一響應者的結果就是可以輸入文本內容并彈出鍵盤,所以,我們可以在這個方法中通過返回值來判斷是否彈出鍵盤。

//UITextField調用此方法- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField{ //返回YES是彈出鍵盤 返回NO則不彈出鍵盤}//UITextView調用此方法- (BOOL)textViewShouldBeginEditing:(UITextView *)textView{ //返回YES是彈出鍵盤 返回NO則不彈出鍵盤}

2.1 收起鍵盤的控制

通過前面的分析我們知道,收起鍵盤主要是要注銷文本框的第一響應者身份即可,所以,我們再需要控制鍵盤收起的時候調用 textFieldShouldEndEditing: 方法即可達到目的。關于收起鍵盤,我們通常有兩種做法如下:

一是通過我們的鍵盤上的【return/完成】按鍵的點擊事件來設置

二是設置點擊空白處就收起鍵盤,這種方法現在比較普遍

這兩種做法在UITextField和UITextView上的實現在我之前的隨筆中有專門講到過了,想了解的小伙伴可以直接戳這里:ios學習――鍵盤的收起

三 文本框內容的獲取

在之前的分析中,我們知道,文本框在結束之后都會調用一個方法就是 textFieldDidEndEditing: / textViewDidEndEditing: 方法,這個方法就是方便我們在輸入結束之后對文本框內容進行處理。如果我們開發過程中一個頁面有多個相同類型的輸入文本框,我們可以通過設置不同的tag來區分當前的是哪一個輸入文本框,從而進行不同的處理,具體示例如下:

- (void)textViewDidEndEditing:(YYTextView *)textView{ if (textView.tag == 400) {  NSString *reason = textView.text;  [self.submitInfoDic setObject:reason forKey:@"reason"]; } else {  NSString *remark = textView.text;  [self.submitInfoDic setObject:remark forKey:@"remark"]; }}

四 鍵盤彈出的遮擋問題

還是在之前的分析中,我們知道在鍵盤彈出和收起時,系統都會發出對應的通知,所以我們可以在收到鍵盤彈出的時候判斷鍵盤的位置和當前輸入文本框的位置,如果有遮擋,就將當前視圖進行一個向上平移,在收到鍵盤回收的通知時就平移到原先的位置。所以,主要分為2步:

注冊鍵盤彈出和收起的通知事件

#pragma mark notification 通知管理/** * @brief 通知注冊 * @return */- (void)registNotification{ // observe keyboard hide and show notifications to resize the text view appropriately [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];  [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];}

實現收到鍵盤彈出和收起通知事件的響應事件

#pragma mark --鍵盤彈出收起管理-(void)keyboardWillShow:(NSNotification *)note{ CGRect frame = self.textViewFrame; //獲取鍵盤高度 NSDictionary* info = [note userInfo]; CGSize kbSize = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size; //140是文本框的高度,如果你的文本框高度不一樣,則可以進行不同的調整 CGFloat offSet = frame.origin.y + 140 - (self.view.frame.size.height - kbSize.height); //將試圖的Y坐標向上移動offset個單位,以使界面騰出開的地方用于軟鍵盤的顯示 if (offSet > 0.01) {  WEAKSELF  [UIView animateWithDuration:0.1 animations:^{   weakSelf.tableView.contentOffset = CGPointMake(0, offSet);  }]; }}-(void)keyboardWillHide:(NSNotification *)note{ [UIView animateWithDuration:0.1 animations:^{  self.tableView.contentOffset = CGPointMake(0, 0); }];}

多時候,我們有多個輸入文本框,在我們的示例中,我們就有兩個輸入文本框,這時候我們收到通知的時候怎么判斷是哪個文本框呢?在前的分析中,我們知道,在發出通知之前,系統會調用輸入文本框代理的 textFieldShouldBeginEditing: 方法來判斷是否允許編輯,那么我們可以在這個方法中判斷是哪一個文本框以及文本框的具體位置等等,然后在鍵盤彈出時通過為止比較確定是否平移,以及平移的offset。

- (BOOL)textViewShouldBeginEditing:(YYTextView *)textView{ //獲取當前輸入文本框相對于當前view的位置 self.textViewFrame = [textView convertRect:textView.frame toView:self.view]; return YES;}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久国内精品在线| 亚洲大胆美女视频| 91社影院在线观看| 亚洲欧美日韩精品久久亚洲区| 亚洲人成网站999久久久综合| 亚洲精品一区av在线播放| 精品无人国产偷自产在线| 亚洲香蕉在线观看| 97精品国产97久久久久久免费| 国产精品免费在线免费| 国产偷国产偷亚洲清高网站| 久热在线中文字幕色999舞| 在线观看久久av| 国产精品久久色| 国产精品久久中文| 久久久久久久久久国产精品| 韩国19禁主播vip福利视频| 国产女同一区二区| 亚洲精品资源在线| 国产精品美腿一区在线看| 久久久精品免费视频| 午夜欧美不卡精品aaaaa| 日韩中文字幕视频| 成人免费直播live| 成人在线视频网站| 欧美一级大片在线观看| 日av在线播放中文不卡| 91久久精品美女高潮| 亚洲精品理论电影| 久久影视免费观看| 国产日韩精品在线播放| 欧美中在线观看| 国产91成人在在线播放| 日韩在线视频免费观看| 日韩精品一区二区视频| www.欧美精品一二三区| 欧美性猛交99久久久久99按摩| 深夜福利一区二区| 日韩欧美亚洲综合| 国内外成人免费激情在线视频| 国产成一区二区| 成人国产精品色哟哟| 国产精品a久久久久久| 国模私拍一区二区三区| 日韩精品欧美激情| 欧美在线影院在线视频| 亚洲片在线观看| 国产这里只有精品| 亚洲深夜福利网站| www.精品av.com| 中文字幕欧美日韩精品| 国产精品久久久久久久久久久久久久| 国产日韩欧美日韩| 最近2019中文字幕mv免费看| 日韩电影中文字幕av| 成人精品视频久久久久| 国内免费精品永久在线视频| 日韩在线欧美在线国产在线| 亚洲美女又黄又爽在线观看| 一区二区三区黄色| 欧美性xxxxxxx| 亚洲国产另类久久精品| 欧美激情在线观看视频| 亚洲欧美日韩精品| 一区二区三区无码高清视频| 亚洲国产精品va| 国内精品久久久久影院优| 国产免费一区视频观看免费| 久久成人精品一区二区三区| 久久久久久国产免费| 在线免费看av不卡| 国产欧美一区二区三区在线看| 亚洲第一中文字幕在线观看| 91精品国产九九九久久久亚洲| 隔壁老王国产在线精品| 国产欧美日韩综合精品| 91免费视频网站| 欧美主播福利视频| 日韩免费在线免费观看| 国产精品wwww| 日韩69视频在线观看| 亚洲视频日韩精品| 中文字幕国产亚洲2019| 亚洲天堂av女优| 久久久久国产精品一区| 精品国产乱码久久久久久天美| 亚洲人成电影在线播放| 96pao国产成视频永久免费| 成人性生交大片免费看视频直播| 欧美视频不卡中文| 久久精品国产亚洲精品| 精品国产自在精品国产浪潮| 欧美日韩国产精品一区二区不卡中文| 亚洲欧美一区二区三区在线| 欧美最猛性xxxx| 97在线精品国自产拍中文| 国产亚洲美女精品久久久| 精品性高朝久久久久久久| 欧美色xxxx| 黄色一区二区在线观看| 成人两性免费视频| 欧美午夜激情小视频| 一区二区av在线| 两个人的视频www国产精品| 91豆花精品一区| 亚洲精品v欧美精品v日韩精品| 日本一区二区在线播放| 国产精品劲爆视频| 国产剧情日韩欧美| 欧美在线观看视频| 欧美超级乱淫片喷水| 精品国产一区二区三区久久久狼| 日韩精品视频免费在线观看| 97香蕉超级碰碰久久免费软件| 亚洲美女黄色片| 亚洲欧美国产日韩天堂区| 97国产精品视频人人做人人爱| 久久久久久亚洲精品中文字幕| 91亚洲va在线va天堂va国| 亚洲精品一区久久久久久| 午夜剧场成人观在线视频免费观看| 日本成人在线视频网址| 欧美精品久久久久久久久| 久久香蕉国产线看观看网| 中文字幕一精品亚洲无线一区| 亚洲国产成人久久综合一区| 亚洲人成网站999久久久综合| 亚洲人成在线电影| 欧美在线视频导航| 色青青草原桃花久久综合| 精品国产一区二区三区久久| 中文字幕精品一区二区精品| 在线日韩精品视频| 日韩av在线天堂网| 亚洲综合一区二区不卡| 国产一区二区三区在线播放免费观看| 亚洲mm色国产网站| 国产美女精品视频免费观看| 国产精品∨欧美精品v日韩精品| 亚洲精品国产精品国自产在线| 亚洲福利视频网站| 国产精品1234| 色综合伊人色综合网站| 久久精品国产成人精品| 久久久久99精品久久久久| 91网站在线免费观看| 亚洲欧美日韩天堂一区二区| 国产精品久在线观看| 欧美日韩高清在线观看| 欧美—级a级欧美特级ar全黄| 97在线视频一区| 欧美成人三级视频网站| 青青a在线精品免费观看| 国产精品久久久久久久久久| 亚洲自拍另类欧美丝袜| 亚洲成年人影院在线| 亚洲va男人天堂| 亚洲国产99精品国自产| 欧美巨猛xxxx猛交黑人97人| 日韩在线观看精品| 97高清免费视频| 久久久精品美女| 亚洲第一精品福利| 国产精品久久久久久久美男|