2012-01-25 2 views
2

У меня есть приложение на основе представления, и в одном из подзонов есть UIScrollView. Я написал обработчики, чтобы настроить размер прокрутки, когда клавиатура появляется и исчезает. Я хотел бы, чтобы клавиатура была уволена, когда пользователь покидает представление, поэтому я звоню [currentField resignFirstResponder] в viewWillDisappear. Это отклоняет клавиатуру, но не вызывает обработчик для изменения размера прокрутки (когда я вызываю тот же код в других местах, он делает это). Какие-либо предложения?iOS Dismiss Keyboard on View Change

EDIT: Это обработчики, которые я использую:

-(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] где-нибудь еще, он вызывает обработчик без проблем.

+0

Можете ли вы показать код обработчиков для размера просмотра прокрутки ? Почему вы ожидаете, что их автоматически назовут? – Jim

+0

Где вы снимаете себя как наблюдателя для этих уведомлений? – NJones

+0

Ваш код работает для меня. Какой тип перехода вы используете для части «пользователь выходит из представления»? – NJones

ответ

0

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

-(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]; 
Смежные вопросы