设置UITableView contentOffset,然后拖动,查看偏移跳转到新位置

时间:2012-10-31 12:52:08

标签: iphone uitableview uiscrollview

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

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

有关如何在编辑时忽略此行为的任何想法吗?

- (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];
}

2 个答案:

答案 0 :(得分: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是否有害。

答案 1 :(得分:1)

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

应用EdgeInset的firstResponder
[self.tableView setContentOffset:CGPointMake(0.0f, 0.0f) animated:YES];
[self.tableView setContentInset:UIEdgeInsetsZero];

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