Размер виртуальной клавиатуры iOS без центра уведомлений

Мне нужно прокрутить вверх мой scrollView, когда нажата textFiewl, что ниже виртуальной клавиатуры. Я звоню [self.scrollView setContentOffset:scrollPoint animated:YES];, Чтобы получить видимую область экрана, мне, очевидно, нужен размер в КБ.

Я знаком с

NSDictionary *info = [notification userInfo];

CGSize kbSize = [self.view convertRect:
                 [info[UIKeyboardFrameBeginUserInfoKey] CGRectValue]
                              fromView:nil].size;

однако, это не работает для меня, потому что, когда пользователь нажимает на, возможно, наполовину скрытое текстовое поле, я не получаю уведомление клавиатуры.

Поэтому я называю метод в textFieldDidBeginEditing:, который вызывается до того, как клавиатура отправит сообщение, и поэтому я не знаю размер КБ при первом нажатии.

Таким образом, вопрос: возможно ли получить размер КБ, не вызывая соответствующее уведомление? Программно, а не жестко.

1 ответ

Вы делаете это не правильно.

Вам также необходимо прослушать уведомления о показе / скрытии клавиатуры, а затем настроить экран.

Вот пример кода скелета:

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
    [nc addObserver:self selector:@selector(keyboardChangedStatus:) name:UIKeyboardWillShowNotification object:nil];
    [nc addObserver:self selector:@selector(keyboardChangedStatus:) name:UIKeyboardWillHideNotification object:nil];
}

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];

    NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
    [nc removeObserver:self name:UIKeyboardWillShowNotification object:nil];
    [nc removeObserver:self name:UIKeyboardWillHideNotification object:nil];
}

#pragma mark - Get Keyboard size

- (void)keyboardChangedStatus:(NSNotification*)notification {
    //get the size!
    CGRect keyboardRect;
    [[[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] getValue:&keyboardRect];
    keyboardHeight = keyboardRect.size.height;
    //move your view to the top, to display the textfield..
    [self moveView:notification keyboardHeight:keyboardHeight];
}

#pragma mark View Moving

- (void)moveView:(NSNotification *) notification keyboardHeight:(int)height{
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.3];
    [UIView setAnimationBeginsFromCurrentState:YES];

    CGRect rect = self.view.frame;

    if ([[notification name] isEqual:UIKeyboardWillHideNotification]) {
        // revert back to the normal state.
        rect.origin.y = 0;
        hasScrolledToTop = YES;
    } 
    else {
        // 1. move the view's origin up so that the text field that will be hidden come above the keyboard (you need to adjust the value here)
        rect.origin.y = -height;
    }

    self.view.frame = rect;

    [UIView commitAnimations];
}
Другие вопросы по тегам