键盘出现时向上移动 UITextField 和 UITableView
Posted
技术标签:
【中文标题】键盘出现时向上移动 UITextField 和 UITableView【英文标题】:Shift UITextField and UITableView up when keyboard comes up 【发布时间】:2014-02-16 09:32:05 【问题描述】:我有一个视图 1. 导航栏 2.UITableView 3. UITextView。
当我开始编辑 textView 时,会出现一个键盘,我需要为 TextView 和 TableView 设置动画。我已经实现了:https://***.com/a/8704371/1808179,但这会将整个视图动画化,覆盖导航栏。
我尝试单独为 textView 设置动画,例如:
- (void)keyboardWillShow:(NSNotification*)notification
CGRect chatTextFieldFrame = CGRectMake(chatTextField.frame.origin.x,chatTextField.frame.origin.y-218,chatTextField.frame.size.width,chatTextField.frame.size.height);
[UIView animateWithDuration:0.5 animations:^ chatTextField.frame = chatTextFieldFrame;];
但它没有动画,也不会与 TableView 同步动画。
在不覆盖导航栏的情况下为 tableView 和 textView 设置动画的最佳方法是什么?
【问题讨论】:
您是否尝试更改表格高度而不是原点? @Wain 这似乎有效。谢谢! 【参考方案1】:我在处理这个问题时一般使用follow sn-p。
使用 UITableView(它只是 UIScrollView 的子类)你应该设置contentInsets
而不是每次都改变框架。这在带有半透明键盘的 ios7 中尤其好。
- (void)viewDidLoad;
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
- (void)dealloc;
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil];
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillHideNotification object:nil];
#pragma mark - Keyboard Notifications
- (void)keyboardWillShow:(NSNotification *)notification;
NSDictionary *userInfo = [notification userInfo];
NSValue *keyboardBoundsValue = [userInfo objectForKey:UIKeyboardFrameEndUserInfoKey];
CGFloat keyboardHeight = [keyboardBoundsValue CGRectValue].size.height;
CGFloat duration = [[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] floatValue];
NSInteger animationCurve = [[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] integerValue];
UIEdgeInsets insets = [[self tableView] contentInset];
[UIView animateWithDuration:duration delay:0. options:animationCurve animations:^
[[self tableView] setContentInset:UIEdgeInsetsMake(insets.top, insets.left, keyboardHeight, insets.right)];
[[self view] layoutIfNeeded];
completion:nil];
- (void)keyboardWillHide:(NSNotification *)notification;
NSDictionary *userInfo = [notification userInfo];
CGFloat duration = [[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] floatValue];
NSInteger animationCurve = [[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] integerValue];
UIEdgeInsets insets = [[self tableView] contentInset];
[UIView animateWithDuration:duration delay:0. options:animationCurve animations:^
[[self tableView] setContentInset:UIEdgeInsetsMake(insets.top, insets.left, 0., insets.right)];
[[self view] layoutIfNeeded];
completion:nil];
【讨论】:
TextField应该如何处理? 我认为在表格视图中实际上会自动向上滚动,对吗?如果没有,您可以抓住它的框架并在 tableView 上手动调用scrollToRect
。
textView 和 tableView 是分开的——它在下面
请注意,这仅在纵向且只有当 tableView 框架延伸到屏幕底部时才能可靠地工作。请参阅我的要点以获得更强大的处理框架的方法 - gist.github.com/TimMedcalf/9505416
这是一个很好的解决方案,但动画不同步发生。我的意思是键盘的速度不同于 textField 速度【参考方案2】:
如果有人想知道,我就是这样做的:
- (void)keyboardWillShow:(NSNotification*)notification
CGRect chatTableViewFrame = CGRectMake(0,65,320,chatTableView.frame.size.height-180);
[UIView animateWithDuration:0.3 animations:^ chatTableView.frame = chatTableViewFrame;];
CGRect chatTextFieldFrame = CGRectMake(chatTextField.frame.origin.x,chatTextField.frame.origin.y-170,chatTextField.frame.size.width,chatTextField.frame.size.height);
[UIView animateWithDuration:0.3 animations:^ chatTextField.frame = chatTextFieldFrame;];
[self.chatTableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:self.chat.count-1 inSection:0] atScrollPosition:UITableViewScrollPositionBottom animated:YES];
keyboardWillHide 反之亦然。
【讨论】:
【参考方案3】:在想要的事件上写下这一行。
self.view.frame = [[UIScreen mainScreen] applicationFrame];
【讨论】:
以上是关于键盘出现时向上移动 UITextField 和 UITableView的主要内容,如果未能解决你的问题,请参考以下文章