Wie können adaptive Xcode 6-Benutzeroberflächen abwärtskompatibel mit iOS 7 und iOS 6 sein?

137

Ich habe gerade das WWDC-Video Nr. 216 "Erstellen einer adaptiven Benutzeroberfläche mit UIKit" gesehen.

Gegen 45:10 Uhr spricht Tony Ricciardi über Änderungen an IB in Xcode 6, um die neuen Änderungen zu unterstützen.

Er sagt: "Sie können diese Dokumente rückwärts für ältere Versionen von iOS bereitstellen."

(wobei "Diese Dokumente" vermutlich XIBs und Storyboards bedeuten, die spezifische Einstellungen für verschiedene Größenklassen haben.)

Ich mache das nicht nach. Sehen Sie sich das WWDC-Video an.

Wie ist das möglich? Merkmalssammlungen und Größenklassen sind nur in iOS 8 definiert. Wie kann das Laufzeitverhalten, das von UI-Konstrukten abhängt, die für iOS 8 neu sind, in früheren iOS-Versionen funktionieren?

Wenn es ist möglich , es wäre sehr schön sein. Sie können Apps erstellen, die unter iOS 6, 7 und 8 ausgeführt werden, und die neuen flexiblen UI-Layout-Funktionen nutzen, die Apple Xcode 6 hinzugefügt hat. Ich habe selbst adaptive UI-Logik im Code erstellt, und das ist ziemlich viel der Arbeit.

Duncan C.
quelle
2
Es gibt jetzt auch ein Dokument von Apple, das die Kompatibilität mit Versionen <8
Alladinian

Antworten:

151

Änderungen an der Benutzeroberfläche mit Größenklassen im Interface Builder werden auf iOS 7-Geräten und in der Vorschau in Xcode korrekt angezeigt. Zum Beispiel habe ich einige Einschränkungen für das automatische Layout und Schriftgrößen für die reguläre Höhe und die reguläre Breite geändert. Diese geänderten Einschränkungen sind im iPad Simulator unter iOS 7.0 sichtbar.

Alle Größenklassenoptimierungen werden iOS 7 zur Verfügung gestellt, mit Ausnahme von Größenklassen mit einer kompakten Höhe. Dies wurde von Apple bestätigt und ist jetzt direkt in der Dokumentation angegeben :

Für Apps, die iOS-Versionen vor iOS 8 unterstützen, sind die meisten Größenklassen abwärtskompatibel.

Größenklassen sind abwärtskompatibel, wenn:
- die App mit Xcode Version 6 oder höher erstellt wurde
- das Bereitstellungsziel der App früher als iOS 8 ist
- Größenklassen in einem Storyboard oder xib angegeben werden
- Der Wert der Höhenkomponente nicht kompakt ist

Da iOS 7 einige Größenklassen nicht berücksichtigt, treten bei Verwendung Probleme auf. Beispiel: Wenn Sie Compact w Any h definiert und dann Compact w Compact h definiert haben, wird unter iOS 7 das Compact w Any h berücksichtigt, unter iOS 8 wird jedoch das Erscheinungsbild Compact w Compact h wiedergegeben.

Wenn Sie also diese beiden Größenklassen verwenden und die Kompatibilität mit iOS 7 beibehalten möchten, würde ich alle gewünschten Optimierungen für das iPhone im Querformat in Any w Any h oder Compact w Any h vornehmen und dann Ihre anderen Optimierungen für verschiedene Größenklassen durchführen Auf diese Weise müssen Sie keine Größenklasse mit kompakter Höhe verwenden und vermeiden Probleme.

Jordan H.
quelle
Ich kann bestätigen, dass in Beta4 die Größenklasse Compact / Compact im Simulator oder auf einem iOS 7-Gerät nicht berücksichtigt wird. Interessant, dass einige Größenklassen jedoch respektiert werden. Danke fürs Testen.
Remmah
Testen auf Normal / Regular auf einem Gerät und es reagiert NICHT auf Größenklassenanpassungen, alles was ich bekomme ist Any / Any mit Beta 7
hokiewalrus
@hokiewalrus Ich habe gerade mit Xcode 6 Beta 7 nachgesehen und genau die gleichen Ergebnisse erhalten, die ich in der Antwort angegeben habe. Das Ändern der Breite der Box in IB für Regular Regular wird auf dem iPad mit iOS 7.1 korrekt angezeigt.
Jordan H
3
@ Joey das ist kein Fehler; das ist beabsichtigt. Compact-Compactwird nicht für iOS 7 exportiert; Compact-Regularist. Siehe meine Antwort für weitere Details.
Dave DeLong
2
Sollte die akzeptierte Antwort sein, ist die obige Antwort irreführend.
Dominic Lacaille
68

Wenn Sie Ihre App für iOS 7 bereitstellen, kompiliert Xcode Ihr Storyboard auf zwei verschiedene Arten:

  • Für das iPhone wird Ihr Storyboard als "Compact-Regular" (Kompakte Breite, normale Höhe) kompiliert und als "~ iphone" -Spitze verpackt.

  • Für das iPad wird Ihr Storyboard als "Regular-Regular" kompiliert und als "~ ipad" -Spitze verpackt.

Wenn Sie also sowohl für iOS 7 als auch für iOS 8 bereitstellen möchten, sollten Sie Ihr Design auf die Größenklassen Compact-Any und Regular-Any konzentrieren. Auf diese Weise erhalten Sie die beste Erfahrung hinsichtlich der Anpassung der Benutzeroberfläche über Bereitstellungsziele hinweg. Sie können das Layout natürlich auch für andere Größenklassen ändern. Wenn diese Änderungen jedoch nicht auf die Größenklassen Compact-Regular oder Regular-Regular angewendet werden, werden diese Änderungen unter iOS 7 nicht angezeigt.

Dave DeLong
quelle
Mein Verständnis Ihrer Antwort ist, dass "Regular-Regular" in iPad iOS7 funktionieren sollte. Aber es funktioniert nicht. Ich habe in XCode6 GM Release getestet. Bitte korrigieren Sie mich, wenn ich Ihre Antwort falsch interpretiert habe.
Iducool
4
Es scheint, dass regulär-regulär nur am Storyboard arbeitet, nicht am xib
Boris Charpentier
@ BorisCharpentier Ich habe einen Fehler über diesen Rdar gemeldet: // 18737656 , der als Duplikat der geöffneten # 18490866
Maxim Pavlov
@ BorisCharpentier hast du eine Lösung für xib gefunden?
Saadnib
4
@ BorisCharpentier, ich habe gerade festgestellt, dass dieses Problem in XCode 6.1.1 behoben wurde :-)
Saadnib
27

Hinweis: Diese Antwort war für eine Beta-Version von Xcode 6 relevant und gilt nicht mehr für die Versandversion. Die richtigen Informationen finden Sie in den Antworten von Joey und Dave DeLong auf dieser Seite.

(ursprüngliche Antwort unten beibehalten):


Während die Storyboards/XIBsKonfiguration für die Verwendung von Größenklassen ausgeführt wird iOS 7, berücksichtigt das Betriebssystem diese derzeit nicht size classesund scheint die Standardgrößenklasse "Beliebig / Beliebig" zu verwenden.

Ich bin damit einverstanden, dass die bestimmte Folie, auf die Sie sich beziehen, eine solche Kompatibilität zu versprechen scheint, aber dies scheint derzeit nicht der Fall zu sein (Xcode 6 beta 2).

Zum Testen habe ich ein Projekt (iOS 8 SDK, deployment target of 7.1)mit einer einzelnen Schaltfläche erstellt, die vertically and horizontallyin der Größenklasse Beliebig / Beliebig zentriert ist , aber in der Größenklasse Kompakt / Kompakt (z. B. iPhone im Querformat) an der oberen linken Ecke ausgerichtet ist. Der Vorschau-Assistent von Xcode zeigt an, dass die Schaltfläche ihre Position ändert iOS 8, jedoch nicht iOS 7. Ich habe dieses Verhalten auch auf einem iOS 7Gerät bestätigt .

remmah
quelle
Roy, danke für die Antwort. Ich hatte noch keine Zeit, dies selbst zu testen, und ich weiß es zu schätzen. Der Moderator in diesem Video hätte klarer sein sollen. Ich denke, er muss gemeint haben, dass die XIB / Storyboard-Dateien von iOS 6 und 7 gelesen werden können, aber ohne Unterstützung für die adaptive Benutzeroberfläche. Dies macht die Codierung für Apps, die unter iOS <8 ausgeführt werden, problematisch.
Duncan C
Tatsächlich. Ich frage mich, ob es eine offizielle Dokumentation darüber gibt, wie die neueren Größenklassen und der ältere Orientierungs- / Redewendungsansatz in demselben Storyboard / XIB unterstützt werden können. Ich werde die Antwort aktualisieren, wenn ich etwas finde.
Remmah
Nach meiner Erfahrung scheint Apple zu glauben, dass ältere Betriebssystemversionen nicht mehr existieren, sobald sie eine neue Version ankündigen. Tatsächlich scheint das Engineering-Team nicht mehr auf eine neue Betriebssystemversion zu achten, sobald sie veröffentlicht wird, und sich auf die nächste Hauptversion zu konzentrieren. Ich habe NIE einen Fehler, den ich eingereicht habe, in der aktuellen Hauptversion behoben. Sie
Duncan C
3
Dies scheint bei Xcode 6 Beta 4 nicht mehr der Fall zu sein. Siehe die Antwort, die ich gerade hinzugefügt habe.
Jordan H
1
@ Joey danke für die Heads-Ups; Ich habe meine Antwort bearbeitet, um die Leser auf Ihre Antwort sowie auf die von Dave zu verweisen.
Remmah
12

Da einige der Antworten und Kommentare die Art der Abwärtskompatibilität erörterten, dachte ich, ich würde einen Auszug direkt aus der Apple-Dokumentation veröffentlichen :

~~~~~

Bereitstellen einer App mit Größenklassen in früheren iOS-Versionen

Für Apps, die iOS-Versionen vor iOS 8 unterstützen, sind die meisten Größenklassen abwärtskompatibel.

Größenklassen sind abwärtskompatibel, wenn:

  • Die App wurde mit Xcode Version 6 oder höher erstellt
  • Das Bereitstellungsziel der App ist früher als iOS 8
  • Größenklassen werden in einem Storyboard oder xib angegeben
  • Der Wert der Höhenkomponente ist nicht kompakt

~~~~~

Dieser letzte Aufzählungspunkt zielt auf diese Diskussion ab, bei der Apple bestätigt, dass die Abwärtskompatibilität beibehalten werden sollte , solange "kompakte Höhe" nicht verwendet wird.

Hoffe das hilft jemandem!

radiovisuell
quelle
Es ist großartig, dass dies jetzt dokumentiert ist, danke für die Veröffentlichung!
Jordan H
3

Während ich mich mit dem ähnlichen Problem befasste, fand ich eine andere Antwort, die ich hier noch nicht gesehen habe. Es sieht so aus, als würden Größenklassen in XIBDateien überhaupt nicht funktionieren. Wenn ich einen storyboardZellenprototyp in der Datei erstelle, funktioniert dies in iOS7, wie in anderen Antworten erläutert. Wenn jedoch dieselbe Prototypzelle in separate XIBDateigrößenklassen verschoben wird, werden sie in iOS7 ignoriert.

Hier ist ein Link zu dem Beispielprojekt, das dieses Verhalten demonstriert: https://dl.dropboxusercontent.com/u/6402890/testSizeClasses.zip

In der Prototypzelle habe ich vier Einschränkungen von jedem Rand der grauen Ansicht. Jedes der ist auf die gleiche Weise konfiguriert: Beliebig / Beliebig - 10, Normal / Normal - 20

Geben Sie hier die Bildbeschreibung ein

Es funktioniert gut im iOS8-Simulator für XIB und Storyboard, und in iOS7 werden nur in Storyboard definierte Zellen auf dem iPad aktualisiert:

Geben Sie hier die Bildbeschreibung ein

sha
quelle
$ ^% $ ^% @ # ^ & @ #% & ^% ... und hier bin ich mit vielen xib-Dateien und Bereitstellung auf iOS 7 und 8.
TheEye
Genau. Ich kombinierte iPhone- und iPad-Storyboards zu einem und dachte, dass das Trennen von Zellen in ihre eigene XIB-Datei helfen würde :). Ich würde mich freuen, wenn Sie +1 meine Antwort können.
sha
1
Ich sehe das gleiche Verhalten.
Bjtitus
2

Wenn es jemandem Zeit spart, glaube ich , dass die Art und Weise, wie Xcode 6 quasi Abwärtskompatibilität für Größenklassen bietet, über die historischen ~ipadund ~iphoneangehängten Storyboards erfolgt und nicht mehr. Dies ist sinnvoll, da Größenklassen eine abstraktere Methode sind, wie wir zuvor ein iPad-Storyboard und ein iPhone-Storyboard definiert haben.

Deshalb:

  • Wenn Sie Größenklassen verwenden möchten, um gerätefamilienspezifische Layouts (iPad oder iPhone) zu unterstützen, haben Sie Glück: Größenklassen sind eine bessere Schnittstelle zu der zuvor unterstützten Methode.

  • Wenn Sie Größenklassen verwenden möchten, um geänderte Layouts für verschiedene Modelle innerhalb derselben Gerätefamilie zu unterstützen, z . iPhone 5/6/6 + inc. Landschaft, dann hast du kein Glück . Die Verwendung dieser würde ein Mindestziel für die Bereitstellung von iOS 8 erfordern.

Jonathan Crooke
quelle
1

@lducool - Ändern Sie im Interface Builder im Identitätsinspektor 'Builds For' in iOS7.1 und höher.

Ash R.
quelle
Kein Unterschied in der Ausgabe.
Iducool
1

Leider funktionieren die Antworten von Dave und Joey bei mir nicht. Ich darf in diesem Thread keine Kommentare abgeben. Bitte vergib mir, wenn dies der falsche Ort ist.

Ich habe mir dafür eine spezielle Frage gestellt: Beispiel für eine adaptive Benutzeroberfläche im iPhone-Hochformat, die abwärtskompatibel mit iOS 7 ist

Nach dem, was ich bisher gelernt habe, glaube ich jetzt, dass es wie in meinem Beispiel nicht möglich ist, zwei separate, unterschiedliche Einschränkungen für ein UI-Element im Hoch- und Querformat mit dem iPhone iOS7 basierend auf Größenklassen festzulegen. Würde mich aber freuen, wenn ich mich irre.

Tom Major
quelle