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