iphone - 设置UITableView contentOffset,然后拖动, View 偏移跳转到新位置

标签 iphone uitableview uiscrollview

我有一个比 self.view 稍大的 UITableView。我在 View 底部有一个 UITextField,当文本字段开始编辑时,我使用委托(delegate)方法 -textFieldDidBeginEditing: 将 View 向上移动。

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

有什么想法可以在编辑时覆盖此行为吗?

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

最佳答案

避免这种行为的方法是同时应用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 方法中实现一些检查,以检查您的文本字段是否仍在 View 中。

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

关于iphone - 设置UITableView contentOffset,然后拖动, View 偏移跳转到新位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13158402/

相关文章:

iphone - UIPickerView 添加到 UIScrollView 时不滚动!

iphone - MKMapView 一次加载所有注释 View (包括那些在当前矩形之外的 View )

ios - 如何在 UITableView 上 float 所有部分标题 View (或保持所有可见)?

arrays - 快速从 TableView 列表中删除多个项目

iphone - 最大 CAShapeLayer 大小?

ios - Scrollview 如何与 Autolayout 一起工作,为什么设置底部垂直空间约束使其工作?

iphone - 在网格上旋转 CGPoint 的最佳方法是什么?

iphone - 何时捕获 UILabel 的高度?

ios - 然后在 Promisekit 中重新加载 tableview

ios - UIImageView:AspecT Fit 无法与 UIScrollView 一起使用以将其缩放到全宽