2012-01-25 10 views
2

私はビューベースのアプリケーションを持っており、サブビューの1つにUIScrollViewがあります。キーボードが現れて消えると、スクロール・ビューのサイズを調整するハンドラを書いています。ユーザーがビューを離れるときにキーボードを解除したいので、[currentField resignFirstResponder]viewWillDisappearに呼び出します。これによりキーボードは閉じられますが、スクロールビューのサイズを変更するハンドラは呼び出されません(別の場所で同じコードを呼び出すと、そのようになります)。助言がありますか?iOSキーボードを表示変更で閉じる

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が掲載される前に、オブザーバーとして削除されていたので、うれしく思いました。しかし、UIKeyboardWillHideNotificationUIKeyboardWillShowNotificationを見ることは、おそらくキーボードに対するあなたの反応には十分でしょう。キーボード通知には、ユーザー情報キー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]; 
関連する問題