效果演示:
解決的問題:鍵盤(keyboard)彈出時(shí)覆蓋了tableViewCell上的輸入框。
關(guān)于這個(gè)問題最初我是用了系統(tǒng)的UITableViewController類浸踩,這個(gè)類里系統(tǒng)處理了鍵盤的彈出與輸入框之間的位置關(guān)系闰渔。But2室小U叽骸栅隐!在使用UITabBarController的時(shí)候膘侮,它計(jì)算出的位置關(guān)系就會(huì)有49高度的誤差屈糊。。琼了。至于原因我也沒有找到(雖然知道肯定和tab有關(guān)但是真的不知道怎么處理)逻锐,如果哪位朋友有解決方法的真心求教。雕薪。昧诱。
既然系統(tǒng)的UITableViewController不會(huì)用了,那我就只能自己寫一個(gè)自己的TableViewController了所袁。
下面上代碼:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
通過這兩個(gè)監(jiān)聽可以得到鍵盤彈出以及收起的時(shí)機(jī)盏档,然后我們就可以做相應(yīng)處理了。
- (void)keyboardWillShow:(NSNotification *)notice {
if (self.startContentOffset.y > self.tableView.contentOffset.y) {
self.startContentOffset = self.tableView.contentOffset;
}
NSDictionary *info = [notice userInfo];
CGSize size = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size;//鍵盤的大小
self.duration = [[info objectForKey:UIKeyboardAnimationDurationUserInfoKey] floatValue];//鍵盤出現(xiàn)的動(dòng)畫時(shí)間
CGFloat keyboardY = [UIScreen mainScreen].bounds.size.height - size.height - 64;//鍵盤的最高點(diǎn)Y值
//currentTextFieldFrame屬性為當(dāng)前輸入框相對(duì)于tableView的frame燥爷,在子類中賦值
if ((self.currentTextFieldFrame.origin.y + self.currentTextFieldFrame.size.height - self.startContentOffset.y) > keyboardY) {
[UIView animateWithDuration:self.duration animations:^{
//這里你完全可以再加上一點(diǎn)間隔~
self.tableView.contentOffset = CGPointMake(0, (self.currentTextFieldFrame.origin.y + self.currentTextFieldFrame.size.height) - keyboardY);
}];
}
}
在鍵盤彈出的時(shí)候用一個(gè)中間量記錄tableView的contentOffset蜈亩,并比較鍵盤的最高點(diǎn)是否覆蓋在textField上
- (void)keyboardWillHide:(NSNotification *)notice {
[UIView animateWithDuration:self.duration animations:^{
self.tableView.contentOffset = self.startContentOffset;
}];
}
鍵盤收起時(shí)還原tableView.contentOffset
- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil];
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillHideNotification object:nil];
NSLog(@"Execution dealloc");
}
最后在dealloc的時(shí)候移除監(jiān)聽
具體邏輯就是這樣了,下面是我寫的一個(gè)demo~
傳送門:毛小崔的github
歡迎各位的回復(fù)局劲,有疑問也可以寫出來勺拣,當(dāng)然有更好方案的提出來就更好了~