場景一
在iOS開發(fā)中,我們經(jīng)常處理這樣的情況:
當(dāng)鍵盤出現(xiàn)或者消失的時候,我們需要做一些相應(yīng)的操作壳贪。比如鍵盤上面的工具條的位置變化等。
這里我們就假設(shè)有一個工具條在鍵盤的上面寝杖,我們要求當(dāng)鍵盤出現(xiàn)的時候违施,工具條的位置向上移動始終在鍵盤的上面,當(dāng)鍵盤消失的時候瑟幕,工具條向下移動到屏幕的下面磕蒲。
這時候,我們應(yīng)該怎么處理呢只盹?
思路
為了讓工具條上下移動辣往,我們就要求出鍵盤上下移動的高度值,從而知道工具條該上下移動的高度值
想獲取鍵盤的移動值殖卑,就要對鍵盤的顯示和隱藏進(jìn)行監(jiān)聽站削,我們這里可以使用通知
是不是覺得思路很清晰了,那么開始吧孵稽。
處理步驟
1许起、給鍵盤設(shè)一個通知
/**
*? 給鍵盤的frame改變添加監(jiān)聽
*? @param keyBoardWillChangeFrame: 監(jiān)聽方法
*/
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(keyBoardWillChangeFrame:) name:UIKeyboardWillChangeFrameNotification object:nil];
2、在鍵盤的通知監(jiān)聽方法里面做需要的操作
- (void)keyboardWillChangeFrame:(NSNotification *)notification
{
// 鍵盤顯示\隱藏完畢的frame
CGRect frame = [notification.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
// 修改底部約束
self.bottomSapce.constant = XMGScreenH - frame.origin.y;
// 動畫時間
CGFloat duration = [notification.userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue];
// 動畫
[UIView animateWithDuration:duration animations:^{
[self.view layoutIfNeeded];
}];
}
上一段代碼解釋:
notification.userInfo:
?notification是指傳遞過來的通知
?userInfo是一個字典菩鲜,存儲任何和通知相關(guān)聯(lián)的可能用到的信息园细。當(dāng)一個通知的值發(fā)生改變的時候,就會將值存儲到userInfo的字典中接校。例如這里的userInfo包含通知執(zhí)行的時間珊肃,和通知結(jié)束時候鍵盤的frame等信息。
也可以改變工具條的transform實現(xiàn):
self.toolbar.transform = CGAffineTransformMakeTranslation(0, -keyboardF.size.height);
自定義鍵盤馅笙,只需要設(shè)置下面的屬性即可
@property (readwrite, retain) UIView *inputView;
最后伦乔,一定要記得在dealoc方法里釋放監(jiān)聽
- (void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
場景二
有時候在同一個界面里面,可能有多個TextField輸入框董习,而點(diǎn)擊不同額輸入框烈和,我們可能希望彈出的鍵盤擁有不同的工具條,這時候我們怎么辦呢皿淋?
思路
首先我們要有那么幾種工具條招刹,可以使用xib方式(簡單,不講解了了窝趣,不知道可以發(fā)郵件給我)
然后設(shè)置不同輸入框的配件視圖(textField.inputAccessoryView = xxxTool)
設(shè)置輸入框成為第一響應(yīng)者疯暑,這樣彈出的時候就能有不同的toolBar了。
代碼實現(xiàn)
//這里不貼圖了哑舒,比較簡單
UIView *tool1 = [[[NSBundle mainBundle] loadNibNamed:@"ToolBar1" owner:nil options:nil] lastObject];
UIView *tool2 = [[[NSBundle mainBundle] loadNibNamed:@"ToolBar2" owner:nil options:nil] lastObject];
self.textField1.inputAccessoryView = tool1;
self.textField2.inputAccessoryView = tool2;
場景三
上面適用的情況是在屏幕底部只有一個輸入框的時候妇拯。有朋友問到當(dāng)一個界面有很多個輸入框,上面的輸入框點(diǎn)擊不需要向上移動,只有下面的點(diǎn)擊才需要界面上移的時候怎么辦越锈?
解決方法
我這里就給出一個解決方案仗嗦,可能不是最優(yōu),希望看到的朋友有更好的方法能夠分享給我甘凭。- 首先讓你的xxxController繼承代理
@interface xxxController()@end
?讓你希望能夠上移的輸入框XXXTextField的代理稱為控制器本身
self.XXXTextField.delegate = self;
?讓控制器監(jiān)聽鍵盤消失的通知稀拐,為的是讓鍵盤消失的時候也能在需要時調(diào)整界面的位置
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(keyBoardWillHideFrame:) name:UIKeyboardWillHideNotification object:nil];
實現(xiàn)UITextField的代理方法和鍵盤的監(jiān)聽方法
- (void)textFieldDidBeginEditing:(UITextField *)textField{
CGRect frame = self.view.frame;
//這里的50是隨便設(shè)置的
frame.origin.y -=50;
frame.size.height +=50;
self.view.frame = frame;
}
-(BOOL)textFieldShouldReturn:(UITextField *)textField{
CGRect frame = self.view.frame;
frame.origin.y +=50;
frame.size.height -=50;
self.view.frame = frame;
[textField resignFirstResponder];
return YES;
}
-(void)keyBoardWillHideFrame:(NSNotification *)notification{
if (self.view.frame.origin.y == -50) {
CGRect frame = self.view.frame;
frame.origin.y +=50;
frame.size.height -=50;
self.view.frame = frame;
}}
常用知識點(diǎn):
成為第一響應(yīng)者(可以調(diào)出鍵盤)
- (BOOL)becomeFirstResponder;
取消第一響應(yīng)者
- (BOOL)resignFirstResponder;
全部取消第一響應(yīng)者
- (BOOL)endEditing:(BOOL)force;? ? //使用這個使得view或者其所有的子視圖都取消第一響應(yīng)者 (optionally force)