4

我有一个拆分视图控制器:view & tableview。在这个表格视图中,我有带有文本字段的自定义单元格。我不知道我会有多少个细胞,所以它会自动生成。现在我正在尝试滚动到文本字段,当它成为FirstResponder 时。我试过这样的事情:

-(void) textFieldDidBeginEditing:(UITextField *)textField {
    CGPoint focusOnTextField = CGPointMake(0, 300 + textField.frame.origin.y);
    [scroller setContentOffset: focusOnTextField animated: YES];
}

300px - 我的 TableView 的起始位置。一切似乎都很好,但textField.frame.origin.y总是等于 0(就像和bounds.origin.y顺便说一句)。

我认为如果获取单元格的位置,哪个文本字段处于活动状态,然后替换textField.frame.origin.ycell.frame.origin.y或类似的东西,我可以解决问题。

==================================================== ==================

我忘了说我的 tableviews 滚动被禁用了。我遵循您的建议和代码示例并像这样解决它:

- (UITableViewCell *)cellWithSubview:(UIView *)subview {

    while (subview && ![subview isKindOfClass:[UITableViewCell self]])
        subview = subview.superview;
    return (UITableViewCell *)subview;
}

- (void)textFieldDidBeginEditing:(UITextField *)textField {
    UITableViewCell *activeCell = [self cellWithSubview:textField];

    float offsetValueY = 200 + activeCell.origin.y;
    CGPoint focusOnTextField = CGPointMake(0, offsetValueY);
    [scroller setContentOffset:focusOnTextField animated:YES];
}

知道吗?它正在工作!:-) 但它产生了一个新问题。当我开始编辑文本字段时,滚动条首先跳到顶部,然后才转到正确的位置。当我写[scroller setContentOffset:focusOnTextField animated:NO];的时候这个问题消失了,但是滚动条没有平滑的移动。这对我很不利 :-) 那么我们该如何解决呢?

4

3 回答 3

5

这是滚动到包含文本字段的单元格的方法...

// find the cell containing a subview.  this works independently of how cells
// have been constructed.

- (UITableViewCell *)cellWithSubview:(UIView *)subview {

    while (subview && ![subview isKindOfClass:[UITableViewCell self]])
        subview = subview.superview;
    return (UITableViewCell *)subview;
}

在编辑开始时触发该操作的想法是正确的。只需使用单元格即可...

- (void)textFieldDidBeginEditing:(UITextField *)textField {

    // find the cell containing this text field
    UITableViewCell *cell = [self cellWithSubview:textField];

    // now scroll using that cell's index path as the target
    NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];
    [self.tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:YES];
}
于 2013-05-14T16:05:15.897 回答
2

如果您在UITableVieCell内容视图中添加文本字段(如果您使用.xib,则默认添加),那么您必须调用类似的内容textField.superview.superview,这将为您提供父单元格。如果您将文本字段直接添加到单元格视图,那么您必须textField.superview.

于 2013-05-14T15:53:45.310 回答
1
[tableView scrollToRowContainingComponent:textField atScrollPosition: UITableViewScrollPositionMiddle animated:YES];

将以下类别添加到 UITableView 后:

@implementation UITableView (MyCategory)

-(NSIndexPath*)indexPathOfCellComponent:(UIView*)component {
    if([component isDescendantOfView:self] && component != self) {
        CGPoint point = [component.superview convertPoint:component.center toView:self];
        return [self indexPathForRowAtPoint:point];
    }
    else {
        return nil;
    }
}

-(void)scrollToRowContainingComponent:(UIView*)component atScrollPosition:(UITableViewScrollPosition)scrollPosition animated:(BOOL)animated {

    NSIndexPath *indexPath = [self indexPathOfCellComponent:component];
    if(indexPath) {
        [self scrollToRowAtIndexPath:indexPath atScrollPosition: scrollPosition animated:animated];
    }
}

@end
于 2013-05-14T16:04:54.233 回答