UIKeyboardDidHideNortification でキーボードの高さを取得しても、高さはゼロではない。

投稿者: | 2012/04/17

 

2012.05.11 改訂

ステータスバーが表示されている場合に対応できるようにソースコードを修正しました。

 

昨日のお蔵出しTips と関連して。

キーボードの高さを取得する | 極上の人生

キーボードを収納したら、当然その高さはゼロになる。
…と思っていたのだが、どうやら違う模様。

困ったことに、UIKeyboardDidHideNortification (キーボード収納後告知)を捉えてキーボードの高さを取得しても、キーボードの高さはゼロではない。

このお陰で、キーボード高さに合わせてツールバー位置などを調整するメソッドの分岐を増やす必要がある。
しまっちゃったんだからゼロで良いじゃないか…(ぶつぶつ)

 

viewWillAppear メソッド

viwWillAppear にNSNortificationCenter を追加して、キーボードの表示/収納を検知

検知も収納も同じfitKeyboardメソッドを呼び出している点に注意。

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    
    NSNotificationCenter* nc = [NSNotificationCenter defaultCenter];
    // キーボード表示を検知。
    [nc addObserver:self 
					selector:@selector(fitKeyboard:) 
					name:UIKeyboardDidShowNotification 
					object:nil];

    // キーボード収納を検知。
    [nc addObserver:self 
					selector:@selector(fitKeyboard:) 
					name:UIKeyboardDidHideNotification 
					object:nil];
}

 

fitKeyboard メソッド

今回の注目ポイント。

昨日は処理を分けたい場合を考えてshowKeyboardメソッドとhideKeyboardメソッドに分けました。
が、単にキーボードサイズに合わせて他の要素を調整するだけなら、1つにまとめちゃいましょう。

- (void)fitKeyboard:(NSNotification*)notification {
    
    // ステータスバーをのぞいた画面高さ
    float afh = [[UIScreen mainScreen] applicationFrame].size.height;
    
    // 画面幅
    float afw = [[UIScreen mainScreen] applicationFrame].size.width;
    
    // NSNortification名
    NSString* nName = notification.name;
    
    // キーボード高さ
    CGRect keyboard;
    keyboard = [[notification.userInfo 
                 objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
    float kbh = keyboard.size.height;
    
    // キーボード収納告知だった場合
    if ( [nName isEqualToString:@"UIKeyboardDidHideNotification"] ) {
        // せっかく取得したキーボード高さを強制的に0にする
        kbh = 0;
    }
    
    // statusBar 高さ
    float sbh = [UIApplication sharedApplication].statusBarFrame.size.height;
    
    // toolBar 高さ
    float tbh = self.toolBar.frame.size.height;
    
    // textViewMemo 高さ
    float tvh = afh - (kbh + tbh);
    CGRect tvFrame = CGRectMake(0.f, sbh, afw, tvh);
    [self.textViewMemo setFrame:tvFrame];
    
    // toolBar Y座標
    float y = tvh + sbh;
    CGRect tbFrame = CGRectMake(0.f, y, afw, tbh);
    [self.toolBar setFrame:tbFrame];
    
}

これで似たようなメソッドを2つ書かずに済みます。

 

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください