scrollToRowAtIndexPath不适用于UITableViewController

时间:2014-07-06 11:06:48

标签: ios objective-c uitableview

我有UITableViewController想要在用户使用scrollToRowAtIndexPath方法点击文本字段底部时滚动

// ViewController

@interface PersonalInfoViewController : UITableViewController{
}

在textFiled Delegate方法上。

-(void) textFieldDidBeginEditing:(UITextField *)textField {
    UITableViewCell *textFieldRowCell = (UITableViewCell *) textField.superview.superview;;
    NSIndexPath* path = [self.tableView indexPathForCell:textFieldRowCell];
    [self performSelector:@selector(scrollToCell:) withObject:path afterDelay:0.5f];
}

//滚动方法

-(void) scrollToCell:(NSIndexPath*) path {
    NSLog(@"%@",path);
    [self.tableView scrollToRowAtIndexPath:path atScrollPosition:UITableViewScrollPositionNone animated:NO];
}

控制台O / P

//尺寸

NSLog(@"%@",NSStringFromCGSize(self.tableView.contentSize));  {320, 711.5}

// Bounds

NSLog(@"%@",NSStringFromCGRect(self.tableView.frame)); {{0, 0}, {320, 568}}

// IndexPath

<NSIndexPath: 0x8e981f0> {length = 2, path = 3 - 0}
<NSIndexPath: 0x8eaa600> {length = 2, path = 3 - 1}
<NSIndexPath: 0x9967d20> {length = 2, path = 2 - 1}

所以问题是。

  • 为什么tableView不会移动到scrollToRowAtIndexPath中的特定indexPath。
  • 使用scrollToRowAtIndexPath的位置和方式。

我不这么认为使用scrollToRowAtIndexPath我们需要设置contectSizeContectOffset

伙计检查我的比赛大小和界限o / p。怎么说比赛大小小于高度

我发现UITableViewScrollPositionTop工作在行的顶部但不是最后4到5的底部

3 个答案:

答案 0 :(得分:3)

以下是您的问题的答案: 因为您的内容高度小于tableview边界高度。

如果您真的需要它,这是工作解决方案

- (void)textFieldDidBeginEditing:(UITextField *)textField {
    CGPoint scrollPoint = CGPointMake(0, textField.frame.origin.y);
    scrollPoint = [_tableView convertPoint:scrollPoint fromView:textfield.superview];
    [_tableView setContentOffset:scrollPoint animated:YES];
}

如果你很好奇,可以在这里深入探讨这个问题:How to make a UITextField move up when keyboard is present?

答案 1 :(得分:0)

您需要确保tableView's contentSize足够大,以便将单元格置于这些位置。在这些情况下,您需要手动为这些单元格计算contentOffset。请尝试以下方法: -

-(void) textFieldDidBeginEditing:(UITextField *)textField {
 CGPoint origin = textField.frame.origin;
CGPoint point = [textField.superview convertPoint:origin toView:self.tableView];
float navBarHeight = self.navigationController.navigationBar.frame.size.height;
CGPoint offset = tableView.contentOffset;   
// Adjust the below value as you need
offset.y += (point.y - navBarHeight);
[tableView setContentOffset:o animated:YES];
}

答案 2 :(得分:0)

我的一个应用程序中遇到了类似的问题。

一般的想法是在UITableView的末尾添加透明视图。 您可以添加页脚或其他单元格。 视图的高度应为:tableView的高度 - 最后一个可见单元格的高度。

以下是我使用的解决方案:

- (void)updateFooterHeightForLastTableViewItem:(UITableView *)tableView {
    NSInteger sectionNumber = [tableView numberOfSections] - 1;
    CGFloat lastCellHeight = [self tableView:tableView heightForRowAtIndexPath:[NSIndexPath indexPathForRow:[tableView numberOfRowsInSection:sectionNumber] inSection:sectionNumber]];
    _lastSectionFooterHeight = MAX(0, tableView.frame.size.height - lastCellHeight);
    [tableView reloadSections:[NSIndexSet indexSetWithIndex:sectionNumber] withRowAnimation:NO];
}

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section  {
    if (section == [tableView numberOfSections] - 1) {
        return _lastSectionFooterHeight;
    }
    return 0;
}

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section {
    CGRect footerRect = CGRectMake(0, 0, 320, [self tableView:tableView heightForFooterInSection:section]);
    UIView *footerView = [[UIView alloc] initWithFrame:footerRect];
    [footerView setBackgroundColor:[UIColor clearColor]];
    [footerView setUserInteractionEnabled:NO];
    return footerView;
}