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