私のiPhone OSアプリケーションでは、画面の特定の部分を再配置するために、デバイスの向きの変化を監視する必要があります。私が使用したアプローチは、_CGRect frame = [UIScreen mainScreen].applicationFrame
_を使用して画面サイズを取得し、そこから他のコントロールのサイズや位置を計算することでした(_self.view.frame
_も試しました)。
これまでのすべてのテストはポートレートモードで行われたため、主な機能のプログラミングに集中し、後でランドスケープの調整を行うことができます。そしてここに問題が入ります:-(void) didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
に進む前にサイズを確認するためにいくつかのログを追加しましたが、どうやら幅と高さの値は「間違っています」(一見すると値が間違っているため私には意味がありません)。
ロギングの出力は次のとおりです。
ランドスケープの「w」と「h」の値が逆になっているように見える-私はw = 480とh = 300であると期待していました。
何が悪いのですか?デバッグに使用したコードは次のとおりです。
_-(void) didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {
CGRect frame = [UIScreen mainScreen].applicationFrame;
CGSize size = frame.size;
NSLog(@"%@", [NSString stringWithFormat:@"Rotation: %s [w=%f, h=%f]",
UIInterfaceOrientationIsPortrait(self.interfaceOrientation) ? "Portrait" : "Landscape",
size.width, size.height]);
}
_
画面の物理的な特性ではなく、デバイスの向きが変更されました。基本的に横に傾けていますが、実際には幅320ピクセル(ステータスバーが表示されているため、現時点では20ピクセルは使用できません)で、高さは480ピクセルです。ビューが自動回転している場合は、幅/高さが変換されていますが、画面の実際の寸法を尋ねると、画面の実際の寸法が返されます。
このため、変換されたビューで作業する場合は、ビューの中心とビューの境界に基づいて計算し、ビューのフレームには決して計算しないことが重要です。
使用する self.view.bounds
代わりに。
同じ問題に遭遇しましたが、いくつかの診断作業で、ビューの境界とフレームがviewDidLoad
のランドスケープの向きを正確に反映していないことがわかりました(ビューコントローラーが押されたときにデバイスがランドスケープに保持されている場合)スタックに)、ただしviewWillAppear:
とviewDidAppear:
では正しく行います。フレーム/境界の寸法を必要とするコードをviewDidLoad
からviewWillAppear:
に移動したところ、正しく機能しました。