landscapeの判定には[UIApplication sharedApplication].statusBarOrientationを使う


デバイスの向きがポートレイトなのかランドスケープなのかの判定をしなければならない場合がある。例えば、キーボードの高さを取得するときだ。viewWillAppear:などでキーボード表示のノーティフィケーションを登録して、下記の場合keyboardWasShownでキャッチする。
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWasShown:)
name:UIKeyboardWillShowNotification object:nil];
そうして
– (void)keyboardWasShown:(NSNotification*)aNotification
{
NSDictionary* info = [aNotification userInfo];
CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
のようにしてキーボードのサイズをとる。ここまでは、Appleのサイトの以下のところに書かれている
Text, Web, and Editing Programming Guide for iOS: Managing the Keyboard
ところが、実際にはキーボードの高さはポートレイトの時には kbSize.height でよいのだが、ランドスケープの時には kbSize.width の方がキーボードの高さになるのだ。

そこで、デバイスの向きを判定することが必要になる。
僕は当初、UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];をつかった。つまり
UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];
if (orientation == UIDeviceOrientationPortrait || orientation == UIDeviceOrientationPortraitUpsideDown ) {
keyboardHeight_ = kbSize.height;
} else {
keyboardHeight_ = kbSize.width;
}
ということになる。ところが、これはまずかった。
なぜかというと、iPhoneがdidRotateFromInterfaceOrientationを判定するのにはある程度余裕が持たせてあって、ちょっとした傾きでは回転しないようになっているが、[UIDevice currentDevice]はすごくシビアに判定してしまうからだ。
例えば、机の上にほぼ平行に置いたiPhoneは表示上はポートレイト状態なのに、実際にはほんのわずかに傾いていて[UIDevice currentDevice]では横向きであると判定してしまうことがあるのである。
この問題をどうすべきか悩んでいたら、どんぴしゃのまさに回答そのものを以下のページで見つけることができた。
objective c – UIKeyBoard resize on orientation change to landscape – Stack Overflow
向きの判定には[UIApplication sharedApplication].statusBarOrientationを使えばよかったのだ。
switch ([UIApplication sharedApplication].statusBarOrientation) {
case UIInterfaceOrientationPortrait:
case UIInterfaceOrientationPortraitUpsideDown:
keyboardHeight_ = kbSize.height;
break;
case UIInterfaceOrientationLandscapeLeft:
case UIInterfaceOrientationLandscapeRight:
keyboardHeight_ = kbSize.width;
break;
}
となる。

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中