38

私の iPhone OS アプリケーションでは、画面の特定の部分を再配置するために、デバイスの向きの変化を監視する必要があります。私が使用したアプローチはCGRect frame = [UIScreen mainScreen].applicationFrame、画面サイズを取得するために使用し、そこから他のコントロールのサイズおよび/または位置を計算することでした(私も試しself.view.frameました)。

ここまでのテストはすべてポートレート モードで行ったので、主な機能のプログラミングに集中し、後でランドスケープの調整を行うことができました。ここで問題が発生します。-(void) didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation先に進む前にサイズを確認するためにいくつかのログを追加しましたが、明らかに幅と高さの値が「間違っています」(一見すると値が意味をなさないため、「間違っている」と言います) .

いくつかのロギングの出力は次のとおりです。

  • 回転: 横向き [w=300.000000, h=480.000000]
  • 回転: 縦 [w=320.000000, h=460.000000]

ランドスケープの "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]);
}
4

3 に答える 3

33

画面の物理的特性ではなく、デバイスの向きが変更されました。基本的には横向きに傾けましたが、実際には幅320ピクセル(ステータスバーが表示されているため、現時点では20ピクセルは使用できません)、高さ480ピクセルです。ビューが自動回転している場合は、幅/高さが変換されていますが、画面の実際の寸法を尋ねると、画面の実際の寸法が返されます。

これは、翻訳されたビューを操作するときに、ビューのフレームではなく、ビューの中心と境界に基づいて計算を行うことが重要である理由でもあります。

于 2010-04-21T22:53:30.463 に答える
27

self.view.bounds代わりに使用してください。

于 2012-04-11T13:04:34.693 に答える
18

私は同じ問題につまずいており、いくつかの診断作業で、ビューの境界とフレームが横向きを正確に反映していないことを発見しましたviewDidLoad(ビューコントローラーがスタックにプッシュされたときにデバイスが横向きに保持されている場合)、しかしと で正しくviewWillAppear:行いviewDidAppear:ます。フレーム/境界の寸法を必要とするコードを から に移動したviewDidLoadところviewWillAppear:、正しく機能しました。

于 2011-05-25T20:40:58.983 に答える