5

重複の可能性:
iPhone で向きを変えた後の「正しくない」フレーム/ウィンドウ サイズ

私は自分のアプリで非常にイライラする問題を解決しようとしています - それを調べていると、iOS にバグが見つかった可能性があります。

iPad を回転するとビューは回転しますが、フレームは変わりません。ビューの幅と高さを毎秒出力するタイマーを実行しています。ビューが視覚的に回転するのはわかりますが、フレームは何があっても「768x1024」のままです。

Appleのドキュメントから:

ユーザー インターフェイスが回転すると、新しい向きに合わせてウィンドウのサイズが変更されます。ウィンドウは、そのルート ビュー コントローラーのフレームを新しいサイズに合わせて調整し、このサイズはビュー階層を下って他のビューに伝達されます。

これはまさに起こっていないことであり、あらゆる種類の問題を引き起こしています. フレームが変わるように回転を修正する方法を知っている人はいますか?

再現する手順:

  1. 新しい空のプロジェクトを作成する
  2. ボーン ストック UIViewController をルート ビューとして追加します。
  3. ルート ビュー コントローラーのフレームの幅と高さを出力するタイマーを設定します。
  4. アプリを実行し、全体を回転させます。これが私がテストしている私のコードです:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] 境界]];
    self.window.rootViewController = [[UIViewController alloc] init];

    NSLog(@"%fx%f", self.window.rootViewController.view.frame.size.width, self.window.rootViewController.view.frame.size.height);

    // 向きを確認するラベルを追加
    UILabel *orientationLabel = [[UILabel alloc] initWithFrame:CGRectMake(10,10,100,30)];
    orientationLabel.text = @"左上";
    [self.window.rootViewController.view addSubview: orientationLabel];

    [NSTimer scheduleTimerWithTimeInterval:.3 target:self selector:@selector(testScale) userInfo:nil repeats:YES];

    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];
    はいを返します。
}
- (無効) testScale {
    NSLog(@"%fx%f", self.window.rootViewController.view.frame.size.width, self.window.rootViewController.view.frame.size.height);
}
4

3 に答える 3

1

代わりに、UIViewController を UINavigationController 内に配置しようとしましたか? 同様の問題があり、修正しました。UINavigationController クラスは、UIViewController よりも優れた回転を処理しているようです。

次のようなことを試してください:

UIViewController *myViewController = [[UIViewController alloc] init];
UINavigationController *myNavigationController = [[UINavigationController alloc] initWithRootViewController:myViewController];
self.window.rootViewController = myNavigationController;
于 2012-11-08T21:37:34.103 に答える
0

バグではありません。あなたが望んでいるのは、bounds代わりに使用することですframe

このように考えてください。デバイスを回転させても、デバイスの画面サイズは変わりません。相変わらずだけど景色が変わる。これが、境界を使用する理由です。

于 2012-11-08T21:17:14.433 に答える
0

ステータスバーの状態を使用できます

 [[UIApplication sharedApplication] statusBarOrientation]

if ステートメントを使用すると、画面が横か縦かを知ることができます

于 2012-11-08T21:27:47.617 に答える