5

我有一个UITableView略大于self.view. 我UITextField在视图底部有一个,– textFieldDidBeginEditing:当文本字段开始编辑时,我使用委托方法将视图向上移动。

这很好用,但是如果我UITextField在编辑时尝试滚动视图(并且内容已经偏移),那么内容会猛烈移动到视图的底部“适当”位置。换句话说,contentOffset.yI 设置更改为等于内容视图的大小(正如您对正常行为所期望的那样)。

任何想法如何在编辑时覆盖此行为?

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    // Scroll to the currently editing text field
    [self scrollViewToTextField:textField];

}

- (void)scrollViewToTextField:(id)textField
{
    // Set the current _scrollOffset, so we can return the user after editing
    _scrollOffsetY = self.tableView.contentOffset.y;

    // Get a pointer to the text field's cell
    UITableViewCell *theTextFieldCell = (UITableViewCell *)[textField superview];

    // Get the text fields location
    CGPoint point = [theTextFieldCell convertPoint:theTextFieldCell.frame.origin toView:self.tableView];

    // Scroll to cell
    [self.tableView setContentOffset:CGPointMake(0, point.y - 12) animated: YES];
}
4

2 回答 2

12

避免这种行为的方法是同时应用contentInset。所以对于上面的例子:

- (void)scrollViewToTextField:(id)textField
{
    // Set the current _scrollOffset, so we can return the user after editing
    _scrollOffsetY = self.tableView.contentOffset.y;

    // Get a pointer to the text field's cell
    UITableViewCell *theTextFieldCell = (UITableViewCell *)[textField superview];

    // Get the text fields location
    CGPoint point = [theTextFieldCell convertPoint:theTextFieldCell.frame.origin toView:self.tableView];

    // Scroll to cell
    [self.tableView setContentOffset:CGPointMake(0, point.y - 12) animated: YES];

    // Add some padding at the bottom to 'trick' the scrollView.
    [self.tableView setContentInset:UIEdgeInsetsMake(0, 0, point.y - 60, 0)];
}

然后确保在编辑后重置插图:

- (void)textFieldDidEndEditing:(UITextField *)textField {
    [self.tableView setContentInset:UIEdgeInsetsMake(0, 0, 0, 0)];
}

这种方法的警告是,您必须在- (void)scrollViewDidScroll:(UIScrollView *)scrollView方法中执行一些检查,以检查您的文本字段是否仍在视图中。

替代方法是在编辑开始时禁用滚动,并在结束时重新启用滚动。您必须确定此操作是否对您的应用程序中的 UX 不利。

于 2012-10-31T16:03:19.107 回答
1

如果您使用输入文本字段,我想补充一点。并且需要滚动然后应用一个应用 EdgeInset 的 firstResponder 使用:

[self.tableView setContentOffset:CGPointMake(0.0f, 0.0f) animated:YES];
[self.tableView setContentInset:UIEdgeInsetsZero];

在 UITableView 中的输入字段获得焦点时停止自动滚动之后。谢谢@squarefrog

于 2013-03-28T12:30:15.327 回答