2015-09-14 7 views
7

Ich habe die neueste Xcode 7.1 Beta installiert und versuche mein Projekt auf dem iPad Pro Simulator auszuführen. Alles ist richtig und alle Funktionen funktionieren korrekt.Optimierung für den neuesten iPad Pro Simulator

Aber ich habe ein Problem mit der Bildschirmgröße ...

Auf dem Hauptbildschirm der Anwendung ausführen ich das nächste Protokoll:

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

I 1024 für Querformat haben. Aber wenn ich eine neue Anwendung in Xcode 7.1 erstelle und den gleichen Code auf dem Hauptbildschirm laufe, erhalte ich einen anderen Wert: 1366.

Heute plane ich Diffs zwischen Projektdateien zu finden, die im alten Xcode (6.4) und der neuesten Beta 7.1 erstellt wurden mit Araxis Merge.

Können Sie jetzt dieses Problem für das alte Projekt beheben?

+0

Gibt es Neuigkeiten zu diesem Problem? Ich habe das gleiche Problem. Egal was ich mache, ich bekomme ständig 1024 * 768 im iPad Pro Simulator. –

+0

@GergelyKovacs für jetzt habe ich keine Ahnung, wie es funktioniert. Ich werde nächste Woche auf dieses Thema zurückkommen. Ich werde die Ergebnisse beschreiben, wenn ich etwas interessantes finde. –

+0

@AlexanderBalabanov - Können Sie uns weitere Informationen zu dem Problem geben, das Sie erfahren, damit wir Ihnen helfen können? Ich bin auch für die Fehlerbehebung bei iPad Pro zuständig und möchte sicherstellen, dass wir alle angemessen unterstützen können. Wo führen Sie Ihre NSLog-Anweisung aus, um die Ansichtsgrenzen anzuzeigen? Verwenden Sie Auto-Layout? Wenn Sie uns etwas mehr Kontext von dem geben können, was Sie erfahren, dann können wir hoffentlich alle zusammenarbeiten, um zu helfen, dies zu lösen. –

Antwort

0

Wenn Sie aus irgendwelchen Gründen den Rahmen von UI-Elementen fest codieren, müssen Sie ihn möglicherweise für das kommende iPad pro ändern. Weil es insgesamt eine andere Bildschirmgröße (in Punkten) hat.

Wenn Sie automatisches Layout und dynamische Frames (z. B. self.view.bounds.size.width) verwenden, sollte es einfach funktionieren, denke ich.

+0

Ich verwende Auto-Layout und dynamische Frames. Ich habe keine festen Coderahmen. Es ist seltsam, aber es funktioniert nicht gut ... –

+0

Aber was funktioniert nicht für Sie? In der Frage haben Sie erwähnt, dass Ihre App einwandfrei funktioniert. –

+0

Alles funktioniert gut, aber ich möchte self.view.bounds.size.width Wert == 1366 auf iPad Pro Simulator erhalten. Ich habe nur 1024. Aber wenn ich ein neues Projekt in Xcode 7.1 erstellen, wird der self.view.bounds.size.width Wert == 1366. –

1

TL; DR: Es scheint, dass die Ansichtshierarchie für die iPad Pro Bildschirmgröße bis viewWillLayoutSubviews: nicht eingestellt und viewDidLayoutSubviews: aufgerufen wird. Wann dies vom Layoutsystem aufgerufen wird, hängt von der Konstruktion Ihrer Ansichtshierarchie ab.


Bei der Aktualisierung meiner App für iPad Pro sehe ich auch ähnliches Verhalten. Daher habe ich mir die Lebenszyklus-Ereignisse von View-Controllern genauer angeschaut, um zu sehen, was sowohl in meinem bestehenden Projekt als auch in einem neuen Projekt passiert.

Für ein brandneues Projekt, das einen View-Controller verwendet, der nur eine Navigationsleiste (direkt unter der Statusleiste) und eine primäre Ansicht (bei aktiviertem Auto-Layout den Rest des Raums) enthält, im Landschaftsmodus a la die folgende Screenshot:

Sample view controller with navigation bar and auto-layout

ich die folgende Ausgabe von der Konsole für den view-Controller-Lebenszyklus zu sehen:

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

von dem, was ich hier sehen kann, die Aussicht beginnt mit einem wi dth von 1024 Punkten, aber sobald 'viewDidLayoutSubviews' ausgeführt wurde, wurde die entsprechende Größe ermittelt (1366 Punkte).

In meinem eigenen Projekt für einen Bildschirm, der eine Split-View-Controller verwendet, kann ich ein ähnliches Verhalten sehen:

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

In diesem Fall, da die Hierarchie Ansicht unterscheidet, wird viewWillLayoutSubviews: früher in der angerufene View Controller-Lebenszyklus und die richtige Größe wurde bereits durch die Zeit viewWillAppear: wird aufgerufen. Aber wie Sie sehen können, hängt dies wirklich von Ihrer Ansichtshierarchie ab - daher würde ich empfehlen, dass Sie Ihre Ansichtshierarchie bestätigen und dann den besten Speicherort zum Hinzufügen Ihres auflösungsabhängigen Codes bestimmen.

+0

Die neue 'viewWillTransitionToSize: withTransitionCoordinator:' Methode gibt Ihnen auch die richtige Rahmengeometrie –

+1

Danke für Ihren Kommentar @KoreyHinton! Ich habe mir das noch nicht angeschaut, aber vielleicht ist 'viewWillTransitionToSize: withTransitionCoordinator:' nicht wirklich ein Teil des Standard-View-Controller-Lebenszyklus, und es ist unnötig, dies zu implementieren, nur um die richtige Größe zu erhalten . Laut Apples Dokumenten ist dies für "Größen- und Eigenschaftsänderungen" gedacht, was ich nicht erwarten würde, da sowohl iPad als auch iPad Pro beide regulär/normal für Hoch- und Querformat sind. –

+0

Downvoter: Können Sie bitte einen Kommentar mit Ihrem Anliegen hinterlassen, damit ich versuchen kann, mit meiner Antwort darauf zu antworten? Ich verstehe, dass, während ich keine Erklärung dafür liefern kann, wie Apples Frameworks dies am Back-End handhaben, die Informationen, die ich gepostet habe, genau sind und die tatsächlichen iPad Pro-Grenzen aus dem View-Controller-Lebenszyklus zugänglich sind, wenn auch vielleicht nicht erwarte sie zu sein. Bitte lassen Sie mich wissen, welche zusätzlichen Informationen Sie nützlich finden würden und ich freue mich, bei Bedarf zu recherchieren/aktualisieren. Vielen Dank. –

3

Ich bin vielleicht hier weg, aber ich hatte ein ähnliches Problem mit dem iPad Pro Simulator: es gab mir die Standard 1024 * 768 Punktauflösung. Nach einigen Grabungen erkannte ich, dass ich das Standard-iPad-Startbild verwendete (da es im Asset-Katalog keine iPad Pro-Version gibt), wodurch mein Bildschirm auf 1024 * 768 Punkte beschränkt blieb. Nachdem ich ein Launch-Storyboard eingeführt hatte, fiel alles zusammen und meine App wurde mit der korrekten 1366 * 1024-Punktgröße gestartet.

+0

Ich habe auch eine Einführung Storyboard für meine Anwendung und die Testanwendung, die ich zusammen, um dieses Verhalten zu bestätigen, aber immer noch wie ich in meiner Antwort erklärt Ich sehe die tatsächliche Größe erst später im View Controller-Lebenszyklus. Wenn Sie sagen, dass meine App mit der richtigen Größe gestartet wurde, wo bestätigen Sie dies?Hat Ihr Start-Storyboard eine spezifische Konfiguration? Mein Start-Storyboard ist nur auf den Standard festgelegt: abgeleitete Größe/Ausrichtung/etc. Das Startbild wird ordnungsgemäß angezeigt, aber VCs erhalten erst später die richtigen Grenzen. –

+0

Ich habe die korrekte Größe durch einfaches Protokollieren der Fenstergröße rect bestätigt. Und nein, ich benutze nichts besonderes; so sehr, dass ich tatsächlich eine einfache .xib mit abgeleiteter Größe verwende (kein Storyboard), aber es sollte die gleichen Ergebnisse liefern. –