键盘隐藏时 UITableView 略微上升

Posted

技术标签:

【中文标题】键盘隐藏时 UITableView 略微上升【英文标题】:UITableView slightly goes up when keyboard hides 【发布时间】:2014-03-06 11:59:30 【问题描述】:

我正在使用 UITableView (chatTable) 以及 UITabBar (chatTabBar) 和 imageView 中的一个 textField。我正在使用自动布局。当键盘出现和消失时,我使用以下代码更改视图。

        - (void)keyboardWasShown:(NSNotification*)aNotification
        
            NSDictionary* info = [aNotification userInfo];

            // get animation info from userInfo
            NSTimeInterval animationDuration;
            CGRect keyboardFrame;
            [[info objectForKey:UIKeyboardAnimationDurationUserInfoKey] getValue:&animationDuration];
            [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] getValue:&keyboardFrame];

            // resize the frame
            [UIView animateWithDuration:animationDuration delay:0.0 options:UIViewAnimationOptionCurveEaseOut animations:^

                self.keyboardHeight.constant =  keyboardFrame.size.height - TABBAR_HEIGHT ;
                [self.view layoutIfNeeded];
             completion:nil];

            if ([chatData count] != VALUE_ZERO)
            
                [chatTable scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:([chatData count] - VALUE_ONE) inSection:VALUE_ZERO] atScrollPosition:UITableViewScrollPositionBottom animated:NO];
            
        

        - (void)keyboardWillHide:(NSNotification*)aNotification
        
            NSDictionary* info = [aNotification userInfo];

            // get animation info from userInfo
            NSTimeInterval animationDuration;
            CGRect keyboardFrame;
            [[info objectForKey:UIKeyboardAnimationDurationUserInfoKey] getValue:&animationDuration];
            [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] getValue:&keyboardFrame];

            // Set view frame
            [UIView animateWithDuration:animationDuration delay:2.0 options:UIViewAnimationOptionCurveEaseOut animations:^
                self.keyboardHeight.constant -= keyboardFrame.size.height - TABBAR_HEIGHT;
                [self.view layoutIfNeeded];
             completion:nil];
        

现在,当我按下回车键时,tableview 会上升一点(从屏幕 2 到屏幕 3)。 keyboardHeight 是 tabBar 和主视图之间的底部空间约束。

(屏幕 2)


(屏幕3)

我已经尝试了很多东西,但我无法找到为什么 tableview 会上升一段时间。 (问题是没有流畅的动画。)(注意:我将延迟设置为 2.0 只是为了显示以下屏幕截图(屏幕 3)中发生的情况,否则它的值为 0)

【问题讨论】:

【参考方案1】:

您的问题是当键盘出现时您正在更改表格视图框架,这是错误的。您需要更改 table view 的 contentInset 属性,而不是干预框架。

- (void)keyboardWillShow:(NSNotification *)notification 
  CGFloat height = [notification.userInfo[UIKeyboardFrameBeginUserInfoKey] CGRectValue].size.height - self.tabBarController.tabBar.frame.size.height;
  UIEdgeInsets edgeInsets = UIEdgeInsetsMake(0.0f, 0.0f, height, 0.0f);
  _tableView.contentInset = edgeInsets;
  _tableView.scrollIndicatorInsets = edgeInsets;


- (void)keyboardWillHide:(NSNotification *)notification 
  UIEdgeInsets edgeInsets = UIEdgeInsetsZero;
  _tableView.contentInset = edgeInsets;
  _tableView.scrollIndicatorInsets = edgeInsets;

【讨论】:

我假设由于您设置的自动布局约束,您的表格视图的定位不正确。你应该从深入研究开始。不太确定 height 的值是什么意思,坦率地说,它是键盘高度 - 标签栏高度。 它不起作用,我遇到了同样的问题。当我更改约束时,tableView 框架已经更改。如果我添加不应该是这种情况的收缩。 不,您不必更改框架,只需更改内容插图即可。根本不要更改约束,只需按照我发布的示例修改插图 表的自动布局是正确的,因为scollindicator放置正确。 它正在工作。但我怎样才能将我的 imageView 向上移动......(我没有得到 imageView 的 contentInset)。【参考方案2】:

解决了 contentInset 属性的问题。我正在使用 @Eugene 提到的 contentInset ,并且还更改了 textfiled 底部约束的 constant 属性,以便在显示和隐藏键盘时向上移动。

【讨论】:

以上是关于键盘隐藏时 UITableView 略微上升的主要内容,如果未能解决你的问题,请参考以下文章

UITableView onTouch 隐藏键盘

使用自定义 uitableViewCell 按下回车键或单击 uitableView 时隐藏键盘

如何隐藏 UITableView Header 然后让它重新出现?

如何在iOS Obj-C中隐藏键盘触摸UITableView

隐藏在键盘后面的文本字段

UISearchDisplayController 不再隐藏其下方的完整 UITableView