0

我在视图中有一个嵌入式表格视图。这个嵌入式表格视图的顶行始终可见,即使使用键盘也是如此。如果您在下部单元格中输入某些内容,我希望它们向上滚动(像往常一样)以查看您在文本字段中输入的内容。然而这并没有发生,它们仍然隐藏在键盘后面。我怎样才能改变这个?

谢谢迈克尔

4

3 回答 3

0

您不会免费获得这种行为,您需要自己向上/向下滚动内容。AUITableView继承自 a UIScrollView,因此滚动不是实际问题。要滚动,您可以设置其contentSizecontentOffset(如果您愿意,甚至可以设置动画)。

第一件事是,您想收听这些通知:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];

这些将告诉您键盘是显示还是隐藏。在每种方法中,相应地更改您的contentOffsetand :contentSizeUITableView

- (void)keyboardWillShow:(NSNotification *)notification
{
    // keyboard info
    NSDictionary *userInfo = [notification userInfo];
    CGRect keyboardRect = [[userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
    UIViewAnimationOptions animationCurve = [[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] integerValue];
    NSTimeInterval animationDuration = [[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];

    // offsets
    UIView *cell = myTextField.superView; // assuming your text field is a direct child of the UITableViewCell
    CGFloat textFieldBottomY = self.view.frame.origin.y + myTableView.frame.origin.y - myTableView.contentOffset.y + cell.frame.origin.y + myTextField.origin.y + myTextField.frame.size.height;
    CGFloat keyboardTopY = keyboardRect.origin.y;

    // new content size: add size to be able to scroll
    originalContentOffset = myTableView.contentOffset; // store the original content offset to set back when keyboard hides
    originalContentSize = myTableView.contentSize; // store the original content size to set back when keyboard hides
    CGSize newContentSize = myTableView.contentSize;
    newContentSize.height += keyboardRect.size.height;
    myTableView.contentSize = newContentSize;

    // scroll to just beneath your text field
    [UIView animateWithDuration:animationDuration delay:0 options:animationCurve animations:^{
        myTableView.contentOffset = CGPointMake(0, textFieldBottomY - keyboardTopY);
    } completion:NULL];
}

重置一切:

- (void)keyboardWillHide:(NSNotification *)notification
{
    // keyboard info
    NSDictionary *userInfo = [notification userInfo];
    UIViewAnimationOptions animationCurve = [[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] integerValue];
    NSTimeInterval animationDuration = [[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];

    // move content
    [UIView animateWithDuration:animationDuration delay:0 options:animationCurve animations:^{
        myTableView.contentOffset = originalContentOffset;
    } completion:^(BOOL finished) {
        if (finished) {
            // reset content size
            myTableView.contentSize = originalContentSize;
        }
    }];
}

要检测选择/激活哪个文本字段:

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    myTextField = textField;
}

我没有在 a 上测试代码UITableView,但我最近在 a 上使用了它UIScrollView。再次 - 由于 aUITableView继承自 a UIScrollVIew,这应该不是问题。如果表格视图没有正确滚动到文本字段下方,则 的值textFieldBottomY不正确。

于 2013-06-23T09:54:30.490 回答
0

这是一个链接,其中包含实现此目的的详细说明。它解释了方法UIScrollView,它也将起作用UITableView

如果您使用 aUITableViewController而不是手动添加UITableView视图,您将自动获得该行为。

于 2013-06-23T10:28:10.007 回答
0

您必须滚动到 TextField 和 Tableview 之间的位置,检查这个答案

于 2015-06-04T13:56:56.020 回答