【问题标题】:UITableView resizing but not scrolling properlyUITableView 调整大小但不能正确滚动
【发布时间】:2011-11-23 23:30:05
【问题描述】:

我有这段代码,当我单击单元格内的文本字段时,它会调整表格视图的大小,以便键盘不会与底行重叠。问题是,在调整大小后,它会滚动到表格的顶部,而不是我单击文本字段的单元格。

- (void)keyboardDidShow:(NSNotification *)notification
{
    NSDictionary *userInfo = [notification userInfo];
    CGSize size = [[userInfo objectForKey: UIKeyboardFrameEndUserInfoKey] CGRectValue].size;
    CGRect frame = CGRectMake(self.vitalsTableView.frame.origin.x, 
                              self.vitalsTableView.frame.origin.y, 
                              self.vitalsTableView.frame.size.width, 
                              self.vitalsTableView.frame.size.height - size.height);
    self.vitalsTableView.frame = frame;

    VitalsTableViewCell *cell = (VitalsTableViewCell*)[self.selectedTextField superview];
    [self.vitalsTableView scrollRectToVisible:cell.frame animated:YES];
}

- (void)keyboardWillHide:(NSNotification *)notification
{
    NSDictionary *userInfo = [notification userInfo];
    CGSize size = [[userInfo objectForKey: UIKeyboardFrameEndUserInfoKey] CGRectValue].size;
    self.vitalsTableView.frame = CGRectMake(self.vitalsTableView.frame.origin.x, 
                                      self.vitalsTableView.frame.origin.y, 
                                      self.vitalsTableView.frame.size.width, 
                                      self.vitalsTableView.frame.size.height + size.height);
}

- (void) textFieldDidBeginEditing:(UITextField *)textField {
    self.selectedTextField = textField;
//    [self scrollToRectOfTextField];
    NSIndexPath *path = [self.vitalsTableView indexPathForSelectedRow];
    [self.vitalsTableView scrollToRowAtIndexPath:path atScrollPosition:UITableViewScrollPositionTop animated:YES];
}

- (void)scrollToRectOfTextField {
    VitalsTableViewCell *cell = (VitalsTableViewCell*)[self.selectedTextField superview];
    CGRect r = CGRectMake(self.selectedTextField.frame.origin.x, 
                          cell.frame.origin.y+self.selectedTextField.frame.origin.y,
                          self.selectedTextField.frame.size.width,
                          self.selectedTextField.frame.size.height);
    [self.vitalsTableView scrollRectToVisible:r animated:YES];
    NSIndexPath *path = [self.vitalsTableView indexPathForSelectedRow];
    [self.vitalsTableView scrollToRowAtIndexPath:path atScrollPosition:UITableViewScrollPositionTop animated:YES];
}

【问题讨论】:

    标签: iphone objective-c cocoa-touch uitableview


    【解决方案1】:

    当你改变 tableview 的框架时,它会调用所有必要的方法来重绘它,并将 tableview 的contentOffset 重置为默认值,它位于顶部。每次更改框架时,都必须滚动到所需的 CGPoint 或 CGRect。因此,首先保存要滚动的点,然后调整框架大小,然后滚动到该点相对于新框架的位置。

    我在您的代码中看到您正在滚动,但它是错误的 rect,

    - (void)scrollToRectOfTextField {
        VitalsTableViewCell *cell = (VitalsTableViewCell*)[self.selectedTextField superview];
        CGRect r = CGRectMake(self.selectedTextField.frame.origin.x, 
                              cell.frame.origin.y+self.selectedTextField.frame.origin.y,
                              self.selectedTextField.frame.size.width,
                              self.selectedTextField.frame.size.height);
        [self.vitalsTableView scrollRectToVisible:r animated:YES];
        NSIndexPath *path = [self.vitalsTableView indexPathForSelectedRow];
        [self.vitalsTableView scrollToRowAtIndexPath:path atScrollPosition:UITableViewScrollPositionTop animated:YES];
    }
    

    首先,我将删除最后两行关于滚动到索引路径处的行。其次,如果您检查r.origin,您可能会在 (0, 0) 处得到一个点,因为文本字段框架的原点与其父视图相关,而不是表视图。您可以使用convertRect:toView: 方法确定文本字段的框架相对于表格视图的位置,该方法记录在here 和here 中。

    【讨论】:

    • 对,但我的 scrollToRectOfTextField 方法不应该这样做吗?
    • 哦,是的。更新了我的答案以反映这一点。 :)
    • 另外,你甚至没有打电话给scrollToRectOfTextField。你把它注释掉了。取消注释后它会起作用吗?还是你在别的地方叫它?
    • 当我取消注释时,表格根本不会调整大小。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多