Высота на моей мягкой клавиатуре изменяется при многократном срабатывании - PullRequest
0 голосов
/ 02 марта 2020

У меня есть наблюдаемый метод, который срабатывает, когда отображается soft keyboard. Он работает нормально, но по какой-то причине height из soft keyboard изменяется после того, как он был скрыт, а затем представлен во второй раз. Я не могу найти причину для этого, и, кажется, нет ничего в делегате скрытия, который изменяет его значение. Что вызывает это? Я обошел проблему, сохранив высоту, а затем использовал ее во второй раз, но я хотел бы знать причину этой проблемы.

- (void)keyboardWasShown:(NSNotification*)aNotification
{
    NSDictionary* info = [aNotification userInfo];

    CGSize keyboardSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;

    CGRect visibleRect = self.view.frame;

    if (_storedKeyboardHeight.size.height == 0) {
        _storedKeyboardHeight.size.height = keyboardSize.height;
    }

    visibleRect.size.height = _storedKeyboardHeight.size.height;
    visibleRect.origin.y = self.view.height - visibleRect.size.height;

    CGRect rectOfCellInTableView = [self.loginTableView rectForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:1]];

    //This changes the second time
    NSLog(@"? %f", keyboardSize.height);
    //so I store the original value here
    NSLog(@"? %@", CGRectCreateDictionaryRepresentation(_storedKeyboardHeight));

    if ((rectOfCellInTableView.origin.y + rectOfCellInTableView.size.height) > visibleRect.origin.y){
        CGPoint scrollPoint = CGPointMake(0.0, (rectOfCellInTableView.origin.y + rectOfCellInTableView.size.height) - visibleRect.origin.y + 50);
        [self.loginTableView setContentOffset:scrollPoint animated:YES];
    }
}

Первый раз высота равна 291, второй раз - 233.

1 Ответ

1 голос
/ 02 марта 2020

Проблема в том, что вы проверяете неправильный кадр:

UIKeyboardFrameBeginUserInfoKey

Когда отображается клавиатура, какова ее высота кадра в начале процесса показа, нет интерес для вас. Что вы хотите знать, так это фрейм в конце процесса показа:

UIKeyboardFrameEndUserInfoKey

Кроме того, похоже, что вы получаете уведомление о неправильной вещи. Вы не показали, на какое уведомление вы зарегистрированы, но название вашего метода keyboardWasShown предполагает, что вы получаете уведомление, когда клавиатура показала . Слишком поздно; это уведомление почти никогда не представляет интереса. Вы хотите знать, когда клавиатура покажет .

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