キーボードの高さを取得する

投稿者: | 2012/04/16

 

2012.05.11 改訂

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

 

キーボードの高さを取得するには、NSNortificationCenter でキーボードの表示/格納を検知。
そこから高さを得ます。

キーボードの高さを得られると、ツールバーをキーボードのサイズ変化に合わせて配置できたりします。

 

viewWillAppear メソッド

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

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

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

 

showKeyboard メソッド

キーボード表示検知時に呼び出される。

この例では、ツールバーの位置変更に合わせて、textViewのサイズも変更される。

- (void)showKeyboard:(NSNotification*)notification {
    
    // ステータスバーをのぞいた画面高さ
    float afh = [[UIScreen mainScreen] applicationFrame].size.height;
    
    // 画面幅
    float afw = [[UIScreen mainScreen] applicationFrame].size.width;

    // キーボード高さ
    CGRect keyboard;
    keyboard = [[notification.userInfo 
				 objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
    float kbh = keyboard.size.height;
    
    // 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 = sbh + tvh;
    CGRect tbFrame = CGRectMake(0.f, y, afw, tbh);
    [self.toolBar setFrame:tbFrame];
}

 

hideKeyboard メソッド

キーボード表示検知時に呼び出される。

内容的にほとんどshowKeyboard と同じなので、本当は共通化できる。 *01表示と収納で異なる処理部分が多い場合は、こんな感じで分ければ良いです。
別記事で書くが、UIKeyboardDidHideNortification で取得した高さが0にならないので困る。

- (void)hideKeyboard:(NSNotification*)notification {
    
    // ステータスバーをのぞいた画面高さ
    float afh = [[UIScreen mainScreen] applicationFrame].size.height;
    
    // 画面幅
    float afw = [[UIScreen mainScreen] applicationFrame].size.width;
    
    // キーボード高さ
    float kbh = 0;	// 本当はshowKeyboard:と同じ処理がしたい
    
    // 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, 0.f, afw, tvh);
    [self.textViewMemo setFrame:tvFrame];
    
    // toolBar Y座標
    float y = self.toolBar.frame.origin.y - (kbh + tbh);
    CGRect tbFrame = CGRectMake(0.f, y, afw, tbh);
    [self.toolBar setFrame:tbFrame]; 
}

 


脚注

01 表示と収納で異なる処理部分が多い場合は、こんな感じで分ければ良いです。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

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