8

これは単なるテスト アプリケーションです。作成するのは AppDelegate クラスだけです。ウィンドウ ベースのアプリを作成し、info.plist でサポートされている向きを横向きのみに設定し、次のコードを追加するだけです。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    
[application setStatusBarOrientation:UIInterfaceOrientationLandscapeLeft];

// Override point for customization after application launch.
UIAlertView *test = [[UIAlertView alloc] initWithTitle:@"hu" message:@"hui" delegate:nil cancelButtonTitle:@"hi" otherButtonTitles:nil];
[test show];
[window makeKeyAndVisible];
    NSLog(@"win %f - %f", window.bounds.size.width, window.bounds.size.height);
return YES;
}

ステータス バーの向きを設定する最初の行がない場合、残りのインターフェイスが横向きのままであっても、アラート ビューは縦向きに表示されます。

とにかく、ログはまだこれを提供します:

win 768.000000 - 1024.000000

これは間違った方法です (したがって、実際のアプリにサブビューを追加すると、フレームが正しくありません)

Apple はインターフェイスのローテーションを本当にいじったようです。私は問題しかなかったので、iPhone で起こったことを覚えていません。誰か、これを修正する方法を教えてください。

500 の評判 (私の評判の 10 を除く) を、少なくともこれが起こる理由を説明し、うまくいけば解決策を提供できる人に与えます。

4

7 に答える 7

17

iOS アプリケーション プログラミング ガイド「Launching in Landscape Mode」では、テスト アプリケーションで何が起こっているかを主に説明していると思います。

iOS のアプリケーションは通常、ホーム画面の向きに合わせて縦向きモードで起動します。縦向きと横向きの両方のモードで実行されるアプリケーションがある場合、アプリケーションは常に最初は縦向きモードで起動し、デバイスの向きに基づいて必要に応じて View Controller がインターフェイスを回転できるようにする必要があります。ただし、アプリケーションを横向きモードでのみ実行する場合は、次の手順を実行して、最初に横向きで起動する必要があります。

  • アプリケーションの Info.plist ファイルで、UIInterfaceOrientation キーを追加し、その値をランドスケープ モードに設定します。横方向の場合、このキーの値を UIInterfaceOrientationLandscapeLeft または UIInterfaceOrientationLandscapeRight に設定できます。

  • ビューを横向きモードでレイアウトし、自動サイズ変更オプションが正しく設定されていることを確認してください。

  • ビュー コントローラーの shouldAutorotateToInterfaceOrientation: メソッドをオーバーライドし、目的の横向きの場合にのみ YES を返し、縦向きの場合に NO を返します。

重要:上記の手順では、アプリケーションがビュー コントローラーを使用してビュー階層を管理していることを前提としています。ビュー コントローラーは、向きの変更やその他の複雑なビュー関連のイベントを処理するための大量のインフラストラクチャを提供します。ゲームやその他の OpenGL ES ベースのアプリケーションのように、アプリケーションがビュー コントローラーを使用していない場合は、必要に応じて描画面を回転 (または描画コマンドを調整) して、コンテンツを横向きモードで表示する必要があります。

テスト アプリケーションに関しては、重要な部分は最後のセクションです。ビュー コントローラーがないため、必要な方向に UI を設定する責任はすべてユーザーにあります。そのため、ステータス バーの向きを手動で設定する必要があります。

最初の段落を読んで、iOS アプリは常に縦向きモードで起動し、ルート ビュー コントローラーはビューを回転させてデバイスの向きに合わせ、ウィンドウに追加されるとアニメーションなしですぐに回転します。つまり、UIWindow 自体は回転しないため、その寸法は常に縦向きになります (tadej5553 が言ったように)。さらに、すべての UIWindow サブビューのフレームも縦向きになります (フレームは常に親ビューの座標で定義されるため)。そのため、デバイスをどのように回転させても、ルート ビュー コントローラーのフレームは常に縦向きになります。ただし、ビューの境界プロパティは独自の座標で定義されるため、その高さと幅はビューの現在の向きを反映する必要があります。

実際のアプリで何を達成しようとしているのかは明確ではありませんが、推奨される方法は、ビューを縦向きにレイアウトし、自動回転を処理するように自動サイズ変更プロパティを設定することです (アプリの起動直後またはそれ以降に発生するかどうか)。 .

于 2010-10-22T21:07:47.100 に答える
10

UIWindow は回転について何も知りません。Rotation メソッドは UIViewController にカプセル化されています。(自動回転など)

UIAlertView は、UIApplication のstatusBarOrientationプロパティを使用してアラートの向きを選択します。

// Rotate to a specific orientation.  This only rotates the status bar and updates the statusBarOrientation property.
// This does not change automatically if the device changes orientation.
@property(nonatomic) UIInterfaceOrientation statusBarOrientation;

SDK ヘッダーからわかるように、statusBarOrientation は自動的に変更されません。したがって、あなたまたは UIViewController (自動回転) のいずれかがこのプロパティを変更する必要があります。

縦向き (UIWindow のデフォルトの向きと一致) を開始し、shouldAutorotateToInterfaceOrientation を使用て UIViewController に回転を処理させると、デバイスの向きが変わるたびにUIApplication のstatusBarOrientationが変更されます。

ただし、横向きモードで開始する場合は、手動でstatusBarOrientationを一度設定する必要があります。

お役に立てれば。

于 2010-10-22T11:02:01.620 に答える
6

ビューの境界を使用する

于 2010-10-26T09:30:51.913 に答える
4

Window は常に縦向きのサイズを示します。いつも。

しかし、そのビューは(向きに関して)正しい測定値を提供するので、必ずそれらを使用してください。

于 2010-10-19T20:09:59.310 に答える
3

これを機能させるために私がしたことは次のとおりです。

  • Info.plist には、次のパラメーターがあることを確認してください。
    • 初期インターフェースの向き = 横 (右のホーム ボタン)
    • サポートされているインターフェースの向き
      • 項目 0 = 横向き (右のホーム ボタン)
      • 項目 1 = 横向き (左のホーム ボタン)
  • 自動サイズ変更するビューを含む xib ベースのビュー コントローラーを追加します (サイズ変更の問題を排除するなど)。
    • ここではナビゲーション コントローラーをビュー コントローラーと共に使用しました。

アプリのデリゲートにコードを少し追加します。

_rootViewController = [[RootViewController alloc] initWithNibName:@"RootViewController" bundle:nil]; 
_navigationController = [[UINavigationController alloc] initWithRootViewController:self.launcherViewController];
[window addSubview:self.navigationController.view]; //I think this is the key.
[window makeKeyAndVisible];

キーはビューだと思います。それなしで試してみましたが、iPhoneでは問題なく動作しましたが、iPadではアラートがポートレートモードで表示されました。ビューを追加すると、必要に応じて横向きモードで表示されるアラートが表示されました。

于 2010-10-28T08:00:31.897 に答える
3

手動でステータス バーをいじる代わりに、info.plist ファイルで を設定UISupportedInterfaceOrientationsしてみてください。UIInterfaceOrientationLandscapeLeft次に、アプリを起動すると、アプリはすべてセットアップされます。

ステータスバーの向きを手動で設定するのは、一種の「低レベル」です。ビュー コントローラーもインスタンス メソッドUIInterfaceOrientationLandscapeLeftで返す必要があります。shouldAutorotateToInterfaceOrientation

于 2010-10-19T19:55:12.750 に答える
0

アプリをランドスケープのみのモードにハードコーディングするのに問題がありました。多くの場合、視覚的な問題はありませんでしたが、下の20ピクセルのボタンを選択できませんでした。メインのUIWindowでclipToBoundsを実行し、そのレイヤーに境界線を追加すると、UIWindowがステータスバーの下にあることがわかりました。UIWindowのxオフセットを20に変更しようとしました(UIWindowはまだPortraitであり、その内容はLandscapeです)が、これはUIControllerが20ピクセル下にシフトされたことを意味します(理由はわかりません)。これはあなたとは別の問題ですが、印刷時の境界とフレームが正しいように見えるという点で、あなたと同じ問題を見つけました。

とにかく長い話を短くするために、plistをUIInterfaceOrientationLandscapeLeftからUIInterfaceOrientationLandscapeRightに変更し、UIViewControllerメソッドも次のように変更しました。

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{
  return (interfaceOrientation == UIInterfaceOrientationLandscapeRight);
}

そして、私の問題はすべてなくなりました。Appleのローテーションコードにバグがあり、それが私が何かを実装した方法であることが判明したことを何度も誓いましたが、これは間違いなくAppleのものだと思います。

これで問題が解決するかどうか教えてください

于 2011-02-21T07:50:38.953 に答える