2015-09-14 9 views
7

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

しかし、私は、画面サイズの問題を持っている...

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

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

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

今日、私は古いXcode(6.4)と最新のベータ7.1で作成されたプロジェクトファイルAraxis Mergeを使用します。

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

+0

この問題に関するニュースはありますか?私は同じ問題を抱えている。私が何をしていても、iPad Proシミュレータでは常に1024 * 768を取得しています。 –

+0

@GergelyKovacs今のところ私はそれを動作させる方法がわかりません。来週、この問題に戻るつもりです。私は面白い面白い見つける場合は、結果を説明します。 –

+0

@AlexanderBalabanov - 私たちが援助できるように、あなたが経験している問題に関するさらに詳しい情報を提供できますか?私はまた、iPad Proのサポートをトラブルシューティングしており、すべてが適切にサポートできるようにしたいと考えています。 NSLogステートメントを実行してビューの境界を表示していますか?自動レイアウトを使用していますか?あなたが経験していることのいくつかの文脈を私たちに提供できるならば、うまくいけば、私たちは皆一緒にこの問題を解決するために協力することができます。 –

答えて

0

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

自動レイアウトと動的フレーム(たとえばself.view.bounds.size.width)を使用する場合は、うまく動作するはずです。

+0

私は自動レイアウトと動的フレームを使用しています。ハードコードフレームはありません。それは奇妙ですが、それはうまく動作しません... –

+0

しかし、何があなたのために働いていないのですか?質問では、あなたのアプリは正常に動作していたと述べた。 –

+0

すべて動作しますが、iPad Pro Simulatorでself.view.bounds.size.widthの値== 1366を取得したいと考えています。私は1024しか持っていませんが、Xcode 7.1で新しいプロジェクトを作成すると、self.view.bounds.size.widthの値== 1366になります。 –

1

TL; DR:viewWillLayoutSubviews:viewDidLayoutSubviews:が呼び出されるまで、ビュー階層は、iPadのプロ画面サイズに合わせて調整されていないことが表示されます。これがレイアウトシステムによって呼び出されるときは、ビュー階層の構築に依存します。


iPad用のアプリをアップデートする際にも同様の現象が見られます。そこで、View Controllerのライフサイクルイベントを詳しく見て、既存のプロジェクトと新しいプロジェクトの両方で何が起こっていたのかを確認しました。

ナビゲーションバー(ステータスバーのすぐ下に配置されている)とプライマリビュー(残りのスペースを占有し、自動レイアウトがオンになっている)のみを持つビューコントローラを使用すると、風景モードでラ次のスクリーンショット:

Sample view controller with navigation bar and auto-layout

私は、ビューコントローラのライフサイクルのためのコンソールから次の出力見ている:私はここで見ることができるものから、

-[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}} 

を、ビューwiで始まるdthは1024ポイントですが、 'viewDidLayoutSubviews'が実行されると、適切なサイズが決定されます(1366ポイント)。ビュー階層が異なるためviewWillLayoutSubviews:以前で呼び出される、この場合

-[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}} 

:スプリットビューコントローラを使用している1画面分の私自身のプロジェクトで

は、私は同様の動作を確認することができますコントローラのライフサイクルを表示し、正しいサイズはすでにviewWillAppear:が呼び出された時点で決定されています。しかし、これは実際にビュー階層に依存しているので、ビュー階層を確認して、解像度依存コードを追加する最適な場所を決定することをお勧めします。

+0

新しい 'viewWillTransitionToSize:withTransitionCoordinator:'メソッドは正しいフレームの形状を与えるでしょう –

+1

あなたのコメントのためにありがとう@KoreyHinton!私はまだこれを見ていないので、 'viewWillTransitionToSize:withTransitionCoordinator:'は実際に標準のView Controllerライフサイクルの一部ではないので、これを実装して正しいサイズを得ることは少し不必要に感じます。アップル社のドキュメントによると、これは「サイズと特性の変更」です。これは、iPadとiPad Proの両方がポートレイトとランドスケープの両方のレギュラー/レギュラーであるためにはないと思います。 –

+0

Downvoter:あなたの懸念にコメントを残して、私の答えでそれに対処しようとすることができますか?バックエンドでAppleのフレームワークがこれをどのように処理しているかについては説明できませんが、私が投稿した情報は正確で、実際のiPad Proの境界はView Controllerのライフサイクルからアクセスできます。それらを期待してください。どのような追加情報が役立つかをお知らせください。必要に応じて調査/更新してください。ありがとう。 –

3

私はここにいるかもしれませんが、私はiPad Proのシミュレータで同様の問題を抱えていました。それは私に標準の1024 * 768ポイントの解像度を与え続けました。掘り下げた後、標準のiPad起動イメージ(資産カタログにiPad Proバージョンがないため)を使用していることに気付きました。これは、1024 * 768ポイントのままにしておきたい画面を制限しました。私がストーリーストーリーボードを紹介したら、すべてが整い、私のアプリは正しい1366 * 1024ポイントサイズで起動しました。

+0

私も私のアプリケーションとテストアプリケーションの両方のストーリーボードを私はこの動作を確認するために一緒に置くが、ビューコントローラのライフサイクルの後半まで、実際のサイズが反映されているとは限りません。 「あなたのアプリが正しいサイズで起動しました」と言ったら、どこでこれを確認していますか?あなたの起動ストーリーボードには特定の設定がありますか?私の起動ストーリーボードは、デフォルト:推測サイズ/方向/等に設定されています。起動イメージは適切に表示されますが、VCは後でそれまでは適切な境界を取得できません。 –

+0

ウィンドウサイズrectをロギングするだけで正しいサイズが確認されました。私は特別なものを使用しません。私は実際には(ストーリーボードではなく)推測サイズのシンプルな.xibを使用していますが、同じ結果が得られるはずです。 –