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

首頁 > 系統 > iOS > 正文

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

2019-10-21 18:41:58
字體:
來源:轉載
供稿:網友

在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;}


注:相關教程知識閱讀請移步到IOS開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品美女国产在线| 国产伊人精品在线| 国产精品99久久久久久久久| 亚洲国产日韩欧美在线99| 久久久久久国产三级电影| 中文字幕在线观看亚洲| 91久久久久久久久久久久久| 亚洲欧美日韩中文在线制服| 亚洲电影免费观看高清完整版在线| 精品视频—区二区三区免费| 粉嫩av一区二区三区免费野| 91在线网站视频| 日韩激情av在线播放| 久久99精品视频一区97| 黄色91在线观看| 亚洲激情视频在线| 久久久国产视频91| 国产精品成av人在线视午夜片| 日韩电影免费观看在线| 超薄丝袜一区二区| 97av在线影院| 亚洲综合av影视| 欧美日韩免费看| 精品美女国产在线| 国产精品678| 欧美第一黄色网| 日韩高清有码在线| 久久久精品视频在线观看| 国产精品成av人在线视午夜片| 欧美日韩国产影院| 亚洲成人av资源网| 91超碰caoporn97人人| 国产综合色香蕉精品| 91精品国产色综合久久不卡98口| 国产亚洲人成a一在线v站| 亚洲专区在线视频| 国产日韩一区在线| 国产精品偷伦免费视频观看的| 日韩理论片久久| 日韩成人在线视频观看| 亚洲欧美在线免费| 在线电影av不卡网址| 欧美视频在线看| 美女福利精品视频| 亚洲最大成人免费视频| 91国产精品视频在线| 亚洲一区二区三区777| 欧美性极品xxxx娇小| 成人免费网视频| 懂色av一区二区三区| 在线视频亚洲欧美| 欧美激情第6页| 欧美精品一区二区三区国产精品| 中文字幕亚洲无线码在线一区| 国产欧美va欧美va香蕉在线| 欧美国产激情18| 91免费看片网站| 亚洲精品美女久久| 国产精品天天狠天天看| 91精品国产91久久久| 91精品国产91久久久久久不卡| 97久久超碰福利国产精品…| 日本电影亚洲天堂| 国产精品99久久99久久久二8| 一区二区三区久久精品| 96精品久久久久中文字幕| 欧美性xxxxxx| 国产美女精彩久久| 日韩av在线免费看| 北条麻妃在线一区二区| 国产亚洲一区二区在线| 国产精品久久久久久久久粉嫩av| 在线看欧美日韩| www.久久草.com| 另类图片亚洲另类| 91青草视频久久| 国产成人免费av| 96sao精品视频在线观看| 精品视频在线播放免| 日韩av在线高清| 国产精品久久9| 伊人男人综合视频网| 日韩在线观看免费全| 亚洲精品www| 欧美日韩中文字幕在线视频| 国产精品久在线观看| 国产亚洲在线播放| 日韩欧美999| 91欧美精品午夜性色福利在线| 国产精品毛片a∨一区二区三区|国| 亚洲成色777777女色窝| 国产成人精品免高潮费视频| 久久亚洲影音av资源网| 亚洲人成在线观看网站高清| 一区二区日韩精品| 亚洲一级一级97网| 欧美亚洲在线观看| 日韩成人性视频| 欧美成人四级hd版| 欧美成人激情视频免费观看| 久久青草福利网站| 疯狂做受xxxx高潮欧美日本| 中文字幕亚洲自拍| 成人亚洲激情网| 亚洲午夜激情免费视频| 免费av一区二区| 国产精品亚洲激情| 色综合久久天天综线观看| 国产日韩欧美91| 亚洲欧美在线磁力| 久久久免费精品视频| 尤物99国产成人精品视频| 97视频免费观看| 色yeye香蕉凹凸一区二区av| 亚洲一级黄色片| 精品久久久久久中文字幕大豆网| 亚洲永久在线观看| 亚洲最新av在线网站| 色偷偷av一区二区三区| 久久精品国产2020观看福利| 韩国三级日本三级少妇99| 亚洲永久免费观看| 日韩www在线| 欧美日韩久久久久| 色多多国产成人永久免费网站| 国产一区视频在线| 91在线观看免费观看| 欧美成在线观看| 97香蕉超级碰碰久久免费的优势| 日韩在线免费高清视频| 国产成人涩涩涩视频在线观看| 日韩欧美一区二区三区久久| 欧美午夜性色大片在线观看| 国产精品美女www| 美女999久久久精品视频| 久久久久久免费精品| 97久久精品视频| 欧美一区二区影院| 精品成人久久av| 中文字幕精品www乱入免费视频| 亚洲女性裸体视频| 国产精品日韩一区| 久久精品99久久久香蕉| 国产97在线观看| 精品久久久久久中文字幕一区奶水| 亚洲在线观看视频网站| 久久久综合av| 欧美日韩国产黄| 欧美—级a级欧美特级ar全黄| 欧美日韩999| 久久久亚洲影院你懂的| 国产亚洲综合久久| 日韩久久精品电影| 92看片淫黄大片欧美看国产片| 亚洲最大福利网站| 欧美日韩国产精品| 91精品国产自产91精品| 78色国产精品| 久久久精品中文字幕| 亚洲精品大尺度| 亚洲精品国精品久久99热一| 成人亚洲欧美一区二区三区| 欧美老肥婆性猛交视频| 91经典在线视频|