Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone UITableView调整大小但未正确滚动_Iphone_Objective C_Cocoa Touch_Uitableview - Fatal编程技术网

Iphone UITableView调整大小但未正确滚动

Iphone UITableView调整大小但未正确滚动,iphone,objective-c,cocoa-touch,uitableview,Iphone,Objective C,Cocoa Touch,Uitableview,我有一段代码,当我单击单元格内的文本字段时,它会调整tableview的大小,这样键盘就不会与最下面一行重叠。问题是,在调整大小后,它会滚动到表的顶部,而不是我在其中单击文本字段的单元格 - (void)keyboardDidShow:(NSNotification *)notification { NSDictionary *userInfo = [notification userInfo]; CGSize size = [[userInfo objectForKey: UI

我有一段代码,当我单击单元格内的文本字段时,它会调整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];
}

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

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

- (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)处得到一个点,因为文本字段框架的原点是相对于其superview的,而不是相对于tableview的。您可以通过使用
convertRect:toView:
方法找出文本字段的框架相对于表视图的位置,该方法已被记录并已被描述。

对,但我使用的
scrollToRectOfTextField
方法不应该这样做吗?哦,是的。更新了我的答案以反映这一点。:)而且,您甚至不需要调用
ScrollToRecotftextField
。你把它注释掉了。一旦您取消注释它,它是否工作?或者你在其他地方调用它?当我取消注释时,表根本没有调整大小。