前回から1カ月以上たっているが、開発中のiPadアプリで、本体の回転に関するバグが発生。
前回の「iPhone SDK 本体を回転させた時の処理で悩んだのでメモ」の記事で本体の回転についての記事を書いているが、これには考慮不足があったため、改めてメモを残す。
要件としては、本体のローテート状態を取得する [[UIDevice currentDevice] orientation] について、orientationのプロパティ値について、本体画面の上・下・左・右の他に、水平方向の裏・表が存在しているというもの。
これを知らず、単純にIF分で「横向きの場合とそれ以外」と指定していたため、テーブルの上に置いて操作した場合に、画面が横向きにもかかわらず、処理の途中で縦向きの計算をしてしまっていたのだ。
これを知らず、単純に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 が「これから画面の向きを変える方向」なので、水平の場合でも画面の向きが優先されると考えられる。
そうでないと、純粋に回転状況が取れず、どうしてよいか分からなくなるので助かる。
そんなこんなで覚えておきたい。
最近のコメント