UITableView的contentOffset不断改变自己

时间:2011-03-16 17:28:35

标签: iphone keyboard tableview edit

更新:向下滚动以获取更新。

我有一个UITableView,其中的单元格包含很少的UITextView。当用户开始编辑文本和键盘时,我调整TableView的框架大小,并使用UITableView方法scrollToRowAtIndexPath :::滚动编辑单元格。所有这一切都很完美,直到用户真正开始输入问题是,每次敲击键盘的键时,UITableView的contentOffset属性的y值都会自行改变。

我尝试记录每个键击

NSLog(@"%1.2f, %1.2f, %1.2f, %1.2f", 
          self.table.contentSize.width, 
          self.table.contentSize.height, 
          self.table.contentOffset.x, 
          self.table.contentOffset.y);

这是结果

2011-03-17 00:13:05.380 ...[6243:207] 320.00, 355.00, 0.00, 8.00
2011-03-17 00:13:06.138 ...[6243:207] 320.00, 355.00, 0.00, 13.00
2011-03-17 00:13:06.848 ...[6243:207] 320.00, 355.00, 0.00, 8.00
2011-03-17 00:13:07.578 ...[6243:207] 320.00, 355.00, 0.00, 13.00
2011-03-17 00:13:08.377 ...[6243:207] 320.00, 355.00, 0.00, 8.00

正如您所看到的,contentOffset.y一直在不断变化,这使得TableView在每次击键时都会上下跳动。我的代码中没有更改TableView的contentOffset值的地方,或者至少没有明确地更改。任何人都知道会发生什么?

这是我在显示/隐藏键盘时用来调整TableView大小的代码

- (void)keyboardDidShow:(NSNotification *)notification
{
    if (keyboardAlreadyShow) // in case user jump from one TextView to another
        return;

    NSDictionary *userInfo = [notification userInfo];
    NSValue* aValue = [userInfo objectForKey:UIKeyboardFrameEndUserInfoKey];

    CGRect keyboardRect = [aValue CGRectValue];
    keyboardRect = [self.view convertRect:keyboardRect fromView:nil];

    CGFloat keyboardTop = keyboardRect.origin.y;
    CGRect newFrame = self.view.bounds;
    newFrame.origin.x = self.table.frame.origin.x;
    newFrame.size.width = self.table.frame.size.width;
    newFrame.size.height = keyboardTop;

    NSValue *animationDurationValue = [userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey];
    NSTimeInterval animationDuration;
    [animationDurationValue getValue:&animationDuration];

    [UIView animateWithDuration:animationDuration 
                     animations:^{
                         self.table.frame = newFrame;
                     }];

    NSIndexPath *index = [table indexPathForCell:editingCell];
    [self.table scrollToRowAtIndexPath:index atScrollPosition:UITableViewScrollPositionNone animated:YES];

    keyboardAlreadyShow = YES;

}

- (void)keyboardWillHide:(NSNotification *)notification 
{   
    CGRect newFrame;
    newFrame.origin.y = self.table.frame.origin.y;
    newFrame.origin.x = self.table.frame.origin.x;
    newFrame.size.width = self.table.frame.size.width;
    newFrame.size.height = 430;

    NSDictionary* userInfo = [notification userInfo];

    NSValue *animationDurationValue = [userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey];
    NSTimeInterval animationDuration;
    [animationDurationValue getValue:&animationDuration];

    [UIView animateWithDuration:animationDuration 
                     animations:^{
                         self.table.frame = newFrame;

                     }];

    [self.table scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UITableViewScrollPositionNone animated:YES];
}

- (void)keyboardDidHide:(NSNotification *)notification 
{

    keyboardAlreadyShow = NO;

}

任何帮助都会非常感激。谢谢。

更新:现在我想我可以将问题缩小到这个特定的行

txtLatInteger.text = [NSString stringWithFormat:@"...

哪个txtLatInteger是一个UITextView驻留在TableViewCell中,并且每次另一个TableViewCell中的另一个TextView发生更改时都会更新。因此,如果我注释掉这一行,TableView将不会移动。知道发生了什么吗?

UPDATED2 :好像把UITextView放到UITableViewCell会导致这个弹跳问题。将输入字段更改为UITextField解决此问题(有点)。但是我必须从UITextView中牺牲一些我需要的特定行为。 :(

3 个答案:

答案 0 :(得分:0)

当我的键盘出现与你的代码非常相似时,我正在处理一个弹跳问题。当我的键盘出现时,我以与代码类似的方式为我的UITableView的大小调整设置动画。我将您的代码移植到我的keyBoardDidShow通知中,我获得了与之前几乎相同的功能。

我没有看到你在输入问题时弹跳,所以我理论上你的问题不在于你的keyboardDidShow或keyboardDidHide通知。你有一个名为Cinch的程序吗?我已经看到它导致UITableViews在模拟器中表现得很奇怪。

答案 1 :(得分:0)

似乎把UITextView放到UITableViewCell会导致这个弹跳问题。将输入字段更改为UITextField解决此问题(有点)。但是我必须从UITextView中牺牲一些我需要的特定行为。 :(

答案 2 :(得分:-1)

我遇到了类似的问题。它是UITableview中的UIViewController。我将contentInset (UITableView)设置为(64,0,0,0)

当用户键入行尾时,contentOffset的{​​{1}}将更改为(0,-128)。如果我将UITableView设置为contentInset,那么它可以正常工作。 我在(0,0,0,0)放了一个断点,想跟踪线程堆栈。但似乎系统改变了偏移量。

PS:setContentOffset' s UITextView应为NO。