iOS закрывает клавиатуру при изменении вида - PullRequest
2 голосов
/ 25 января 2012

У меня есть приложение на основе представления, и в одном из подпредставлений есть UIScrollView. Я написал обработчики для настройки размера представления прокрутки, когда клавиатура появляется и исчезает. Я хотел бы, чтобы клавиатура была отклонена, когда пользователь покидает вид, поэтому я вызываю [currentField resignFirstResponder] in viewWillDisappear. Это отклоняет клавиатуру, но не вызывает обработчик, чтобы изменить размер представления прокрутки (когда я вызываю тот же код в других местах, это делает). Есть предложения?

РЕДАКТИРОВАТЬ: это обработчики, которые я использую:

-(void) keyboardWasShown:(NSNotification*) notification
{
    if(keyboardShown)
        return;

    NSDictionary* info=[notification userInfo];
    NSValue* value=[info objectForKey:UIKeyboardFrameEndUserInfoKey];
    CGSize keyboardSize=[value CGRectValue].size;
    CGRect viewFrame=[scrollView frame];
    viewFrame.size.height-=keyboardSize.height;
    scrollView.frame=viewFrame;

    keyboardShown=YES;
}

-(void) keyboardWasHidden:(NSNotification*) notification
{
    NSDictionary* info=[notification userInfo];
    NSValue* value=[info objectForKey:UIKeyboardFrameEndUserInfoKey];
    CGSize keyboardSize=[value CGRectValue].size;
    CGRect viewFrame=[scrollView frame];
    viewFrame.size.height+=keyboardSize.height;
    scrollView.frame=viewFrame;

    keyboardShown=NO;
}

Когда я вызываю [currentField resignFirstResponder] где-либо еще, он вызывает обработчик без проблем.

1 Ответ

0 голосов
/ 26 января 2012

Итак, вы были удалены как наблюдатель до того, как была опубликована UIKeyboardDidHideNotification, рад, что я мог помочь. Но наблюдения UIKeyboardWillHideNotification и UIKeyboardWillShowNotification, вероятно, достаточно для вашей реакции на клавиатуру. Уведомления клавиатуры имеют пользовательскую информационную клавишу UIKeyboardAnimationDurationUserInfoKey, которую можно использовать для анимации настроек кадра с помощью анимации клавиатуры. Это позволяет избежать ощущения «чепухи», которое возникнет у ваших взглядов, если вы не оживите их на новых позициях. Вот быстрый пример того, что вы можете сделать:

-(void)keyboardWillNotificationTarget:(NSNotification *)note{
        // Find current keyboard origin Y 
    NSValue *keyboardCurrentFrameValue = [note.userInfo objectForKey:UIKeyboardFrameBeginUserInfoKey];
    CGFloat currentOriginY = keyboardCurrentFrameValue.CGRectValue.origin.y;
        // Find keyboard Y that will be
    NSValue *keyboardNewFrameValue = [note.userInfo objectForKey:UIKeyboardFrameEndUserInfoKey];
    CGFloat newOriginY = keyboardNewFrameValue.CGRectValue.origin.y;
        // Calculate new frame for scrollView
    CGFloat heightChangeForScrollView = newOriginY - currentOriginY;
    CGRect svFrame = scrollView.frame;
    svFrame.size.height += heightChangeForScrollView;
        // Find duration of animation
    NSNumber *animationDurationNumber = [note.userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey];
    CGFloat animationDuration = animationDurationNumber.floatValue;
        // Animate scrollView with keyboard
    [UIView animateWithDuration:animationDuration animations:^{
        scrollView.frame = svFrame;
    }];
}

Теперь вы просто добавляете этот метод в качестве цели для обоих уведомлений:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillNotificationTarget:) name:UIKeyboardWillShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillNotificationTarget:) name:UIKeyboardWillHideNotification object:nil];
...