21

ランドスケープモードで起動したときにiPadアプリケーションの正しい境界を取得するのに問題があります。Info.plistファイルに適切なキーが設定されており、View Controllerは横向き(および縦向き、ナッチ)で適切に起動します。

私のapplicationDidFinishLaunching:メソッドでは、3秒の遅延後にセレクターを呼び出しており、そのメソッドはを呼び出しますが[[UIScreen mainScreen] applicationFrame]、ポートレートフレーム(つまり、高さ>幅)が返されます。

誰かがこれを修正する方法を知っていますか?それは私にはバグのようなにおいがします(もしそうなら私はレーダーを提出します)、しかしそれが意図された振る舞いであるならば、それはどこに文書化されていますか?

4

8 に答える 8

35

[[UIScreen mainScreen] applicationFrame]特にアプリの起動中は、私は決して頼りません。

コードでビューを作成するときは、スーパービューを使用してフレームを設定します。

「シミュレートされたインターフェース要素」でxibsを使用している場合、それらは正しいサイズになり、すべてがうまく機能します。

UINavigationControllerベースのアプリ

UINavigationControllerベースのアプリの場合は、から直接フレームを取得し、を使用しようとself.navigationController.viewしないでください。UINavigationControllerは、「非表示」サブビューを使用してその役割を果たします。そのため、直接スーパービューは機能しません。[self loadView]self.view.superview

UINavigationControllerは特別です。これは、アプリの起動時に、ナビゲーションコントローラーloadViewが呼び出された後にビューのサイズを変更するためです。自動サイズ変更が開始されると、画面の下部に小さな余白ができてしまいます。

UIScreenを使ってみませんか

[[UIScreen mainScreen] applicationFrame]確実に機能しません(特にランドスケープでのアプリの起動中)。私の経験では、ビューコントローラのinterfaceOrientationプロパティはapplicationFrame向きと一致しません。

于 2010-10-29T13:45:18.637 に答える
14
CGRect bounds = [[UIScreen mainScreen] bounds]; // portrait bounds
if (UIInterfaceOrientationIsLandscape([[UIApplication sharedApplication] statusBarOrientation])) {
    bounds.size = CGSizeMake(bounds.size.height, bounds.size.width);
}
于 2013-02-11T09:52:56.397 に答える
6

これは、ViewControllerが横向きになっているときに正しいCGRectを取得する方法です。

CGRect landscapeBounds;
if (self.view.frame.size.width < self.view.frame.size.height)
    landscapeBounds = CGRectMake(self.view.frame.origin.y, self.view.frame.origin.x, self.view.frame.size.height, self.view.frame.size.width);
else
    landscapeBounds = CGRectMake(self.view.frame.origin.x, self.view.frame.origin.y, self.view.frame.size.width, self.view.frame.size.height);
于 2012-01-31T23:50:42.783 に答える
6

iPadを横向きに持ってアプリを起動すると、View Controllerは最初に縦向きのビューの境界を確認します(向きが横向きを報告している場合でも)。ビューコントローラは、表示される前に横向きに回転するメッセージを受け取ります。

于 2010-04-19T20:59:09.583 に答える
5

これは設計どおりです。スーパービューのサイズを照会し、必要に応じて調整する必要があります。

于 2010-04-19T04:22:38.907 に答える
2

[[UIScreen mainScreen] applicationFrame]アプリが横向きモードの場合でも、常に縦向きの長方形を返します。これは、実際には回転せず、代わりにの変換を変更するだけであるという事実に関連してUIWindow ますrootViewController.view

念のため、ルートビューオブジェクトを縦向きモードと横向きモードで印刷すると、次のように表示されます。

肖像画:

<UIView: 0x96290e0; frame = (0 20; 768 1004); ...

風景:

<UIView: 0x96290e0; frame = (0 20; 768 1004); transform = [0, 1, -1, 0, 0, 0]; ...
于 2013-06-15T21:13:45.707 に答える
1

したがって、Appleのガイドによると、起動イメージを追加し、それに接尾辞-568hを付けます。

健全な心を持っている人がなぜシステム設定をグラフィックに依存させるのか理解できません。しかし、私はテストしたばかりで、うまくいきました。

これは、私が上記の答えを見なかったクイック検索の後に私に教えてくれたスポットであり、誰かに役立つだろうと考えました。

S

于 2013-06-15T20:20:16.953 に答える
0

CordovaプラグインでdismissViewControllerAnimatedを使用してビューを閉じるときに、同じ問題が発生しました。MainViewControllerのviewWillAppearメソッドのsingingAtomコードを変更しました。これは、モーダルビューを閉じた後にサイズ変更されました。

- (void)viewWillAppear:(BOOL)animated
    {
    CGRect appFrame = [[UIScreen mainScreen] applicationFrame];
    UIDeviceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
    if (UIDeviceOrientationLandscapeLeft == orientation || 
        UIDeviceOrientationLandscapeRight == orientation)
            {
            if (appFrame.size.width < appFrame.size.height)
                {
                appFrame = CGRectMake(appFrame.origin.y, appFrame.origin.x, appFrame.size.height, appFrame.size.width);
                }
        }
    self.view.frame = appFrame;
    [super viewWillAppear:animated];
}
于 2012-10-11T07:55:08.247 に答える