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 | 表示と収納で異なる処理部分が多い場合は、こんな感じで分ければ良いです。 |
|---|