UITableView调整大小但不能正确滚动

时间:2011-11-23 23:30:05

标签: iphone objective-c cocoa-touch uitableview

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

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

1 个答案:

答案 0 :(得分:0)

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

我在你的代码中看到你正在滚动,但它是错误的矩形,

- (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),因为文本字段框架的原点是相对于它的超级视图,而不是相对于tableview。您可以使用convertRect:toView:方法找出文本字段框架相对于表格视图的位置,该方法记录为here,并且还描述了here