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つ書かずに済みます。