7

最新の Xcode 7.1 ベータ版をインストールし、iPad Pro シミュレーターでプロジェクトを実行しようとしています。すべてが正しく、すべての機能が正しく動作します。

ただ、画面サイズに問題が...

アプリケーションのメイン画面で、次のログを実行します。

NSLog(@"%f", self.view.bounds.size.width);

横向きの場合は 1024 です。しかし、Xcode 7.1 で新しいアプリケーションを作成し、メイン画面で同じコードを実行すると、別の値 1366 が得られます。

今日は、Araxis Merge を使用して、古い Xcode (6.4) で作成されたプロジェクト ファイルと最新のベータ 7.1 で作成されたプロジェクト ファイルの差分を見つける予定です。

私の古いプロジェクトでこの問題を修正する方法はありますか?

4

3 に答える 3

3

私はここから離れているかもしれませんが、iPad Pro シミュレーターで同様の問題が発生していました。標準の 1024*768 ポイントの解像度が得られ続けました。掘り下げた後、標準の iPad 起動イメージを使用していることに気付きました (アセット カタログに iPad Pro バージョンがないため)。これにより、画面が 1024*768 ポイントのままになるように制限されていました。起動ストーリーボードを導入すると、すべてが適切に配置され、アプリは正しい 1366*1024 ポイント サイズで起動されました。

于 2015-11-09T10:14:14.833 に答える
1

TL;DR:viewWillLayoutSubviews:ビュー階層は、viewDidLayoutSubviews:呼び出されるまで iPad Pro の画面サイズに合わせて調整されないようです。これがレイアウト システムによっていつ呼び出されるかは、ビュー階層の構築によって異なります。


iPad Pro 用にアプリを更新すると、同様の動作も見られます。したがって、ビュー コントローラーのライフサイクル イベントを詳しく調べて、既存のプロジェクトと新しいプロジェクトの両方で何が起こっているかを確認しました。

真新しいプロジェクトの場合、ナビゲーション バー (ステータス バーのすぐ下に配置) とプライマリ ビュー (残りのスペースを占有し、自動レイアウトをオンにして、横向きモード) のみを持つビュー コントローラーを使用すると、次のスクリーンショット:

ナビゲーション バーと自動レイアウトを備えたサンプル ビュー コントローラー

View Controller ライフサイクルのコンソールから次の出力が表示されます。

-[ViewController viewDidLoad] self.navigationBar: .frame: {{0, 20}, {1024, 44}}; .bounds: {{0, 0}, {1024, 44}}
-[ViewController viewDidLoad] self.primaryView: .frame: {{0, 64}, {1024, 704}}; .bounds: {{0, 0}, {1024, 704}}

-[ViewController viewWillAppear:] self.navigationBar: .frame: {{0, 20}, {1024, 44}}; .bounds: {{0, 0}, {1024, 44}}
-[ViewController viewWillAppear:] self.primaryView: .frame: {{0, 64}, {1024, 704}}; .bounds: {{0, 0}, {1024, 704}}

-[ViewController viewWillLayoutSubviews] self.navigationBar: .frame: {{0, 20}, {1024, 44}}; .bounds: {{0, 0}, {1024, 44}}
-[ViewController viewWillLayoutSubviews] self.primaryView: .frame: {{0, 64}, {1024, 704}}; .bounds: {{0, 0}, {1024, 704}}

-[ViewController viewDidLayoutSubviews] self.navigationBar: .frame: {{0, 20}, {1366, 44}}; .bounds: {{0, 0}, {1366, 44}}
-[ViewController viewDidLayoutSubviews] self.primaryView: .frame: {{0, 64}, {1366, 960}}; .bounds: {{0, 0}, {1366, 960}}

-[ViewController viewDidAppear:] self.navigationBar: .frame: {{0, 20}, {1366, 44}}; .bounds: {{0, 0}, {1366, 44}}
-[ViewController viewDidAppear:] self.primaryView: .frame: {{0, 64}, {1366, 960}}; .bounds: {{0, 0}, {1366, 960}}

ここで確認できることから、ビューは 1024 ポイントの幅で開始されますが、「viewDidLayoutSubviews」が実行されると、適切なサイズ (1366 ポイント) が決定されます。

分割ビュー コントローラーを使用している 1 つの画面の自分のプロジェクトでは、同様の動作が見られます。

-[XYZViewController viewDidLoad] self.navigationBar: .frame: {{0, 20}, {1024, 44}}; .bounds: {{0, 0}, {1024, 44}}

-[XYZViewController viewWillLayoutSubviews] self.navigationBar: .frame: {{0, 20}, {1024, 44}}; .bounds: {{0, 0}, {1024, 44}}
-[XYZViewController viewDidLayoutSubviews] self.navigationBar: .frame: {{0, 0}, {1366, 44}}; .bounds: {{0, 0}, {1366, 44}}

-[XYZViewController viewWillLayoutSubviews] self.navigationBar: .frame: {{0, 0}, {1366, 44}}; .bounds: {{0, 0}, {1366, 44}}
-[XYZViewController viewDidLayoutSubviews] self.navigationBar: .frame: {{0, 0}, {1366, 44}}; .bounds: {{0, 0}, {1366, 44}}

-[XYZViewController viewWillAppear:] self.navigationBar: .frame: {{0, 0}, {1366, 44}}; .bounds: {{0, 0}, {1366, 44}}

-[XYZViewController viewWillLayoutSubviews] self.navigationBar: .frame: {{0, 0}, {1366, 44}}; .bounds: {{0, 0}, {1366, 44}}
-[XYZViewController viewDidLayoutSubviews] self.navigationBar: .frame: {{0, 20}, {1366, 44}}; .bounds: {{0, 0}, {1366, 44}}

-[XYZViewController viewWillLayoutSubviews] self.navigationBar: .frame: {{0, 20}, {1366, 44}}; .bounds: {{0, 0}, {1366, 44}}
-[XYZViewController viewDidLayoutSubviews] self.navigationBar: .frame: {{0, 20}, {1366, 44}}; .bounds: {{0, 0}, {1366, 44}}

-[XYZViewController viewDidAppear:] self.navigationBar: .frame: {{0, 20}, {1366, 44}}; .bounds: {{0, 0}, {1366, 44}}

この場合、ビュー階層が異なるため、viewWillLayoutSubviews:はビュー コントローラーのライフサイクルの早い段階で呼び出され、正しいサイズは呼び出されるまでに既に決定されていviewWillAppear:ます。しかし、ご覧のとおり、これは実際にはビュー階層に依存します。そのため、ビュー階層を確認してから、解像度に依存するコードを追加する最適な場所を決定することをお勧めします。

于 2015-10-26T02:59:26.657 に答える
0

何らかの理由で UI 要素のフレームをハードコーディングした場合、今後の iPad Pro では変更が必要になる場合があります。なぜなら、画面サイズ (ポイント単位) がまったく異なるからです。

自動レイアウトと動的フレーム (例: self.view.bounds.size.width) を使用する場合は、問題なく動作するはずです。

于 2015-09-14T07:51:26.343 に答える