摘自cocoaChina
问题:我看到有地方说,在ios4以后 当UITableViewCell里有UITextfield,且输入时键盘遮盖了UITextField时,UITableView会自动上移 UIcatalog例子也是有这个效果的, 但是我自己用代码实现的UITableView没有这个上移效果 请问需要什么其他设置吗
答案:1.再键盘出现时,将frame上移....键盘隐藏时,将frame再调整回来 加个动画效果应该不错....
2.如果你的controller是继承uitableviewcontroller就可以了,处理键盘弹出和消失的代码已经封装在uitableviewcontroller里了,如果不继承,那就用楼上的招儿
3.最正规的办法,用通知 step 1: 在进入视图的时候添加监视:(viewDidLoad什么的)
复制代码
// 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];
step 2:
在键盘动作的时候移动视图:
复制代码
- (void)keyboardWillShow:(NSNotification *)notification { /* Reduce the size of the text view so that it's not obscured by the keyboard. Animate the resize so that it's in sync with the appearance of the keyboard. */ NSDictionary *userInfo = [notification userInfo]; // Get the origin of the keyboard when it's displayed. NSValue* aValue = [userInfo objectForKey:UIKeyboardFrameEndUserInfoKey]; // Get the top of the keyboard as the y coordinate of its origin in self's view's coordinate system. The bottom of the text view's frame should align with the top of the keyboard's final position. CGRect keyboardRect = [aValue CGRectValue]; keyboardRect = [self.view convertRect:keyboardRect fromView:nil]; CGFloat keyboardTop = keyboardRect.origin.y; CGRect newTextViewFrame = self.view.bounds; newTextViewFrame.size.height = keyboardTop - self.view.bounds.origin.y; // Get the duration of the animation. NSValue *animationDurationValue = [userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey]; NSTimeInterval animationDuration; [animationDurationValue getValue:&animationDuration]; // Animate the resize of the text view's frame in sync with the keyboard's appearance. [UIView beginAnimations:nil context:NULL]; [UIView setAnimationDuration:animationDuration]; textView.frame = newTextViewFrame; [UIView commitAnimations]; } - (void)keyboardWillHide:(NSNotification *)notification { NSDictionary* userInfo = [notification userInfo]; /* Restore the size of the text view (fill self's view). Animate the resize so that it's in sync with the disappearance of the keyboard. */ NSValue *animationDurationValue = [userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey]; NSTimeInterval animationDuration; [animationDurationValue getValue:&animationDuration]; [UIView beginAnimations:nil context:NULL]; [UIView setAnimationDuration:animationDuration]; textView.frame = self.view.bounds; [UIView commitAnimations]; }
step 3:
在退出视图的时候注销通知
viewDidUnload:
复制代码
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil]; [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillHideNotification object:nil];
dealloc:
复制代码
[[NSNotificationCenter defaultCenter] removeObserver:self name:nil object:nil];
这些代码是摘自apple sample code KeyboardAccessory.
些许细节自己修改下就好了,比如那个textView
4.
- (BOOL)textFieldDidBeginEditing:(UITextField *)textField
{
UITableViewCell * cell=(UITableViewCell *)[[textField superview] superview];
NSIndexPath *indexPath=[curTable indexPathForCell:cell];
if (indexPath.section==0) {
}else {
[UIView beginAnimations:@"ResizeForKeyBoard" context:nil];
[UIView setAnimationDuration:0.30f];
point = curTable.center;
curTable.center = CGPointMake(160, 120);
[UIView commitAnimations];
}
return YES;
}
- (BOOL)textFieldDidEndEditing:(UITextField *)textField
{
UITableViewCell * cell=(UITableViewCell *)[[textField superview] superview];
NSIndexPath *indexPath=[curTable indexPathForCell:cell];
if (indexPath.section==0) {
}else {
[UIView beginAnimations:@"ResizeForKeyBoard" context:nil];
[UIView setAnimationDuration:0.30f];
curTable.center = point;
[UIView commitAnimations];
}
return YES;
}
-(BOOL)textFieldShouldReturn:(UITextField *)textField
{
[textField resignFirstResponder];
return YES;
}