键盘出现时向上移动 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的主要内容,如果未能解决你的问题,请参考以下文章

出现键盘时向上移动 UIView

键盘重叠时向上移动 UITextField

当使用 Swift 出现键盘时如何向上移动 UIViewController 的内容

检测UITextField的焦点更改

键盘出现时如何滚动 UIScrollView?

使用键盘时使用 UIScrollView 滑动并向上移动视图