2011-11-23 30 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