2011-11-23 25 views
1

我有这个代码,当我点击单元格内的文本框,以便键盘不重叠底部行时,调整tableview的大小。问题是,它会调整后,它滚动表中的,而不是我点击了文本框在细胞的顶部。UITableView调整大小,但不正确滚动

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

回答

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

+0

正确,但不应该'scrollToRectOfTextField'方法我有这样做? – Jon

+0

哦,是的。更新我的答案以反映这一点。 :) – john

+0

此外,你甚至不会调用'scrollToRectOfTextField'。你评论它。一旦你取消注释,它会起作用吗?还是你在别的地方叫它? – john