iPhone SDK 本体の回転 [[UIDevice currentDevice] orientation] で落とし穴が

| コメント(0) | トラックバック(0)
前回から1カ月以上たっているが、開発中のiPadアプリで、本体の回転に関するバグが発生。
前回の「iPhone SDK 本体を回転させた時の処理で悩んだのでメモ」の記事で本体の回転についての記事を書いているが、これには考慮不足があったため、改めてメモを残す。
 
要件としては、本体のローテート状態を取得する [[UIDevice currentDevice] orientation] について、orientationのプロパティ値について、本体画面の上・下・左・右の他に、水平方向の裏・表が存在しているというもの。
これを知らず、単純にIF分で「横向きの場合とそれ以外」と指定していたため、テーブルの上に置いて操作した場合に、画面が横向きにもかかわらず、処理の途中で縦向きの計算をしてしまっていたのだ。
 
で、判別するプロパティ値のイメージは以下の通り。

UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];

if (orientation == UIDeviceOrientationUnknown ){

    NSLog(@"デバイスの向きが不明");

}else if (orientation == UIDeviceOrientationPortrait ){

    NSLog(@"ホームボタンが下にある状態");

}else if (orientation == UIDeviceOrientationPortraitUpsideDown ){

    NSLog(@"ホームボタンが上にある状態");

}else if (orientation == UIDeviceOrientationLandscapeLeft ){

    NSLog(@"ホームボタンが右にある状態");

}else if (orientation == UIDeviceOrientationLandscapeRight ){

    NSLog(@"ホームボタンが左にある状態");

}else if (orientation == UIDeviceOrientationFaceUp ){

    NSLog(@"ホームボタンが真上を向いている状態");

}else if (orientation == UIDeviceOrientationFaceDown ){

    NSLog(@"ホームボタンが真下を向いている状態");

}


 
回避方法としては、willRotateToInterfaceOrientation()で、toInterfaceOrientationの値を変数に保持してしまい、各所の処理ではその値を利用するのが得策であるろう。
 
ちなみに、willRotateToInterfaceOrientation()での引数値には、UIDeviceOrientationFaceUp 、UIDeviceOrientationFaceDown の値は入ってこないようだ。これは、引数 toInterfaceOrientation が「これから画面の向きを変える方向」なので、水平の場合でも画面の向きが優先されると考えられる。
そうでないと、純粋に回転状況が取れず、どうしてよいか分からなくなるので助かる。
そんなこんなで覚えておきたい。

トラックバック(0)

トラックバックURL: http://www.siesta-design.com/mtadmin/mt-tb.cgi/15

コメントする

2011年1月

            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31