ContentOffset UITableView продолжает меняться сам - PullRequest
0 голосов
/ 16 марта 2011

ОБНОВЛЕНО : прокрутите вниз для обновления.

У меня есть UITableView, ячейки которого содержат несколько UITextView (ов).Когда пользователь начинает редактировать текст и клавиатуру, я изменяю размер рамки TableView и прокручиваю ячейку редактирования до видимой с помощью метода scrollToRowAtIndexPath ::: из UITableView.Все это прекрасно работает, пока пользователь не начнет печатать.Проблема в том, что каждый раз, когда нажимается клавиша на клавиатуре, значение y свойства contentOffset самого UITableView изменяется.

Я пытаюсь регистрировать это при каждом нажатии клавиши

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 подпрыгивать вверх и вниз при каждом нажатии клавиши.В моем коде нет места, которое бы изменяло значение contentOffset в TableView или, по крайней мере, явно.Кто-нибудь знает, что происходит?

Вот код, который я использую для регулировки размера 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 и будетобновляться каждый раз, когда другой TextView в другом TableViewCell изменяется.Так что, если я закомментирую эту строку, TableView не будет двигаться.Любая идея, что происходит?

UPDATED2 : похоже, что помещение UITextView в UITableViewCell вызывает эту проблему отскакивания.Измените поле ввода на UITextField, чтобы решить эту проблему (вроде).Но я должен пожертвовать некоторым конкретным поведением, которое мне нужно, из UITextView.:(

Ответы [ 3 ]

0 голосов
/ 01 апреля 2011

Похоже, что помещение UITextView в UITableViewCell вызывает эту проблему.Измените поле ввода на UITextField, чтобы решить эту проблему (вроде).Но я должен пожертвовать некоторым конкретным поведением, которое мне нужно, из UITextView.(

0 голосов
/ 08 октября 2016

Я встречал похожую проблему. Это UITableview в UIViewController.Я установил contentInset (UITableView) на (64,0,0,0).

Когда пользователь вводит конец строки, contentOffset из UITableView изменится на (0, -128).Если я установлю contentInset на (0,0,0,0), все будет нормально.Я поставил точку останова на setContentOffset и хочу отследить стек потоков.Но, похоже, система меняет смещение.

PS: UITextView s scrollEnabled должно быть NO.

0 голосов
/ 18 марта 2011

Я работаю над проблемой, которая возникает, когда появляется моя клавиатура, которая очень похожа на ваш код.Когда появляется моя клавиатура, я анимирую изменение размера моего UITableView аналогично вашему коду.Я портировал в вашем коде свое уведомление о keyBoardDidShow и получил почти ту же функциональность, что и раньше.

Я не вижу, как вы подпрыгиваете, когда печатаете, поэтому я теоретизирую, что ваша проблема не в уведомлениях клавиатураDidShow или клавиатураDidHide.У вас установлена ​​программа под названием Cinch?Я видел, что это приводит к странному поведению UITableViews в симуляторе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...