iOS自定義鍵盤彈出view的位置移動(dòng)(三種方法)

當(dāng)彈出鍵盤時(shí)被因,自定義鍵盤上方的view贡翘,有三種解決辦法:

一個(gè)就是利用UITextField或者UITextView的inputAccessoryView屬性著角。

另一種事富,就是監(jiān)聽鍵盤彈出的notification來自己解決相關(guān)視圖的位置問題技俐。

還有一種是覆蓋 TextFileld 的一些方法。

第一種解決方法相對(duì)比較簡單统台,第二種的方法中有一個(gè)難題就是當(dāng)鍵盤的輸入方式雕擂,也就是中英文切換時(shí),鍵盤的高度是會(huì)發(fā)生變化的贱勃。需要?jiǎng)討B(tài)來調(diào)整相關(guān)視圖的位置捂刺。設(shè)定inputAccessoryView屬性UITextField或者UITextView有一個(gè)inputAccessoryView的屬性,其類型是UIView募寨。使用中族展,可以自定義一個(gè)view,并將這個(gè)view傳遞給inputAccessoryView的屬性即可拔鹰。這種實(shí)現(xiàn)方式相對(duì)簡單仪缸,可以滿足很多情況的需求了。下面給出一些示例代碼列肢。

// 新建一個(gè)UITextField恰画,位置及背景顏色隨意寫的。

UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(50, 10, 200, 20)];

textField.backgroundColor = [UIColor grayColor];[self.view addSubview:textField];? ??

// 自定義的view

UIView *customView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 70)];

customView.backgroundColor = [UIColor lightGrayColor];

textField.inputAccessoryView = customView;? ??

// 往自定義view中添加各種UI控件(以UIButton為例)

UIButton *btn = [[UIButton alloc] initWithFrame:CGRectMake(100, 5, 60, 20)];

btn.backgroundColor = [UIColor greenColor];[btn addTarget:self action:@selector(btnClicked) forControlEvents:UIControlEventTouchUpInside];

[customView addSubview:btn];

上面代碼很簡單瓷马,一看就明白了拴还。這里的鍵盤時(shí)通過UITextField的becomeFirstResponder后彈出的。而我在開發(fā)中就碰到了一種情況欧聘,就是需要通過點(diǎn)擊一個(gè)按鈕來彈出鍵盤片林,同時(shí)鍵盤上方的自定義視圖中需要包含一個(gè)UITextView。這時(shí)怀骤,這種情況就不適用了费封。

需要用到第二種方法。監(jiān)聽鍵盤事件動(dòng)態(tài)改變自定義view位置這種方法的思路就是首先自己寫一個(gè)view蒋伦,然后監(jiān)聽鍵盤的事件弓摘,得到鍵盤的位置后調(diào)整自己寫的view的位置,保證這個(gè)view的下邊界與鍵盤的上邊界相接痕届。在自定義view中包含一個(gè)UITextField或者UITextView韧献。通過代碼調(diào)用其becomeFirstResponder方法來彈出鍵盤末患。下面寫一些關(guān)鍵代碼,其中自定義的view名為_mainView锤窑,全局變量璧针。

監(jiān)聽鍵盤事件代碼:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(changeContentViewPosition:) name:UIKeyboardWillShowNotification object:nil];[[NSNotificationCenter defaultCenter] addObserver:self? selector:@selector(changeContentViewPosition:)? name:UIKeyboardWillHideNotification object:nil];

移除監(jiān)聽

[[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil];

[[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillHideNotificatition object:nil];

事件處理函數(shù)

// 根據(jù)鍵盤狀態(tài),調(diào)整_mainView的位置

- (void) changeContentViewPoint:(NSNotification *)notification{? ?

????NSDictionary *userInfo = [notification userInfo];? ?

?????NSValue *value = [userInfo objectForKey:UIKeyboardFrameEndUserInfoKey];? ?

?????CGFloat keyBoardEndY = value.CGRectValue.origin.y;??

????// 得到鍵盤彈出后的鍵盤視圖所在y坐標(biāo)?

????NSNumber *duration = [userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey];?

????NSNumber *curve = [userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey];?

????// 添加移動(dòng)動(dòng)畫果复,使視圖跟隨鍵盤移動(dòng)?

????[UIView animateWithDuration:duration.doubleValue animations:^{

?????[UIView setAnimationBeginsFromCurrentState:YES];

?????[UIView setAnimationCurve:[curve intValue]];

?????_mainView.center = CGPointMake(_mainView.center.x, keyBoardEndY - STATUS_BAR_HEIGHT - ? ? ? ? ?_mainView.bounds.size.height/2.0); // keyBoardEndY的坐標(biāo)包括了狀態(tài)欄的高度陈莽,要減去 }];

}

其中添加了一個(gè)動(dòng)畫渤昌,使得過渡效果好一點(diǎn)虽抄。 mainView中即可添加自定義的UI控件。注意独柑,這個(gè)mainView中控件要從最下面開始布局迈窟,因?yàn)樯鲜龃a是以下方為準(zhǔn)的。

一開始忌栅,我也選擇了第二種车酣,可是當(dāng)點(diǎn)擊的時(shí)候,會(huì)發(fā)生延遲現(xiàn)象索绪,還有救是中英文的問題湖员,后來查資料,找到了第三種解決辦法瑞驱。覆蓋 UITextField 的方法UITextField 的方法有如下:

@interface UIView (UITextField)

- (BOOL)endEditing:(BOOL)force;? ? // use to make the view or any subview that is the first responder resign (optionally force)@end@protocol UITextFieldDelegate@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

UIKIT_EXTERN NSString *const UITextFieldTextDidBeginEditingNotification;

UIKIT_EXTERN NSString *const UITextFieldTextDidEndEditingNotification;

UIKIT_EXTERN NSString *const UITextFieldTextDidChangeNotification;

以下是我寫的代碼

//textField 變成第一響應(yīng)著娘摔,意味著點(diǎn)擊了 textField,然后改變textFieldView 的位置坐標(biāo)

- (void)textFieldDidBeginEditing:(UITextField *)textField? {

CGRect rect = self.textFieldView.frame;

rect.origin.y = self.view.frame.size.height - 216 - 10;

NSTimeInterval animationDuration = 0.3f;

[UIView beginAnimations:@"ResizeForKeyboard" context:nil];

[UIView setAnimationDuration:animationDuration];

self.textFieldView.frame = rect; [UIView commitAnimations];

}

//點(diǎn)擊虛擬鍵盤上的 return 按鈕后

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

[self.textField resignFirstResponder];

return YES;

}

//對(duì)textFieldView 的位置調(diào)整唤反,并返回 YES,從來返回

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField{

CGRect rect = self.textFieldView.frame;

self.textFieldView.frame = CGRectMake(0, self.view.frame.size.height - 49 + 10, rect.size.width, rect.size.height);

return YES;

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末凳寺,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子彤侍,更是在濱河造成了極大的恐慌肠缨,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件盏阶,死亡現(xiàn)場離奇詭異晒奕,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)名斟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門吴汪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蒸眠,你說我怎么就攤上這事漾橙。” “怎么了楞卡?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵霜运,是天一觀的道長脾歇。 經(jīng)常有香客問我,道長淘捡,這世上最難降的妖魔是什么藕各? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮焦除,結(jié)果婚禮上激况,老公的妹妹穿的比我還像新娘。我一直安慰自己膘魄,他們只是感情好乌逐,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著创葡,像睡著了一般浙踢。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上灿渴,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天洛波,我揣著相機(jī)與錄音,去河邊找鬼骚露。 笑死蹬挤,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的棘幸。 我是一名探鬼主播焰扳,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼够话!你這毒婦竟也來了蓝翰?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤女嘲,失蹤者是張志新(化名)和其女友劉穎畜份,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體欣尼,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡爆雹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了愕鼓。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片钙态。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖菇晃,靈堂內(nèi)的尸體忽然破棺而出册倒,到底是詐尸還是另有隱情,我是刑警寧澤磺送,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布驻子,位于F島的核電站灿意,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏崇呵。R本人自食惡果不足惜缤剧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望域慷。 院中可真熱鬧荒辕,春花似錦、人聲如沸犹褒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽化漆。三九已至估脆,卻和暖如春钦奋,著一層夾襖步出監(jiān)牢的瞬間座云,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國打工付材, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留朦拖,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓厌衔,卻偏偏與公主長得像璧帝,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子富寿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

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