Ich habe gerade ein Upgrade auf XCode 4.5 GM durchgeführt und festgestellt, dass Sie jetzt die Größe "4" Retina "auf Ihren View Controller im Storyboard anwenden können.
Wenn ich jetzt eine Anwendung erstellen möchte, die sowohl auf dem iPhone 4 als auch auf dem iPhone 5 ausgeführt wird, muss ich natürlich jedes Fenster zweimal erstellen, aber ich muss auch erkennen, ob der Benutzer ein iPhone mit 3,5 "oder 4" Bildschirm hat, und dann das anwenden Aussicht.
Wie soll ich das machen
Antworten:
Zunächst sollten Sie nicht alle Ihre Ansichten neu erstellen, um sie an einen neuen Bildschirm anzupassen, und auch keine unterschiedlichen Ansichten für unterschiedliche Bildschirmgrößen verwenden.
Verwenden Sie die automatischen Größenänderung von iOS, damit Ihre Ansichten angepasst und jede Bildschirmgröße angepasst werden kann.
Das ist nicht sehr schwer zu lesen einige Dokumentationen darüber. Das spart Ihnen viel Zeit.
iOS 6 bietet dazu auch neue Funktionen.
Lesen Sie unbedingt das iOS 6 API-Änderungsprotokoll auf der Apple Developer-Website.
Und überprüfen Sie das neue iOS 6 AutoLayout Funktionen für .
Wenn Sie das iPhone 5 jedoch wirklich erkennen müssen, können Sie sich einfach auf die Bildschirmgröße verlassen .
Der Bildschirm des iPhone 5 hat eine Höhe von 568.
Sie können sich ein Makro vorstellen, um all dies zu vereinfachen:
Die Verwendung von
fabs
mit dem Epsilon dient dazu, Präzisionsfehler beim Vergleich von Gleitkommawerten zu vermeiden, wie in den Kommentaren von H2CO3 angegeben.Von nun an können Sie es in Standard-if / else-Anweisungen verwenden:
Bearbeiten - Bessere Erkennung
Wie von einigen Leuten angegeben, tut dies nur einen Breitbildschirm , kein tatsächliches iPhone 5.
Die nächsten Versionen des iPod touch verfügen möglicherweise auch über einen solchen Bildschirm, sodass wir möglicherweise andere Makros verwenden.
Benennen wir das ursprüngliche Makro um
IS_WIDESCREEN
:Und lassen Sie uns Modellerkennungsmakros hinzufügen:
Auf diese Weise können wir sicherstellen, dass wir ein iPhone-Modell UND einen Breitbildmodus haben, und wir können das
IS_IPHONE_5
Makro neu definieren :Beachten Sie auch, dass diese Makros, wie von @ LearnCocos2D angegeben, nicht funktionieren, wenn die Anwendung nicht für den iPhone 5-Bildschirm optimiert ist (ohne das Bild [email protected]), da die Bildschirmgröße in solchen Fällen immer noch 320 x 480 beträgt ein Fall.
Ich denke nicht, dass dies ein Problem sein könnte, da ich nicht verstehe, warum wir ein iPhone 5 in einer nicht optimierten App erkennen möchten.
WICHTIG - iOS 8-Unterstützung
Unter iOS 8 spiegelt die
bounds
Eigenschaft derUIScreen
Klasse jetzt die Geräteorientierung wider .Der vorherige Code funktioniert also offensichtlich nicht sofort.
Um dies zu beheben, können Sie
nativeBounds
stattdessen einfach die neue Eigenschaft verwendenbounds
, da sie sich nicht mit der Ausrichtung ändert und auf einem Hochformat basiert.Beachten Sie, dass die Abmessungen von
nativeBounds
in Pixel gemessen werden. Für ein iPhone 5 beträgt die Höhe 1136 statt 568.Wenn Sie auch auf iOS 7 oder niedriger abzielen, stellen Sie sicher, dass Sie die Funktionserkennung verwenden, da Anrufe
nativeBounds
vor iOS 8 Ihre App zum Absturz bringen:Sie können die vorherigen Makros folgendermaßen anpassen:
Wenn Sie ein iPhone 6 oder 6 Plus erkennen müssen, verwenden Sie natürlich die entsprechenden Bildschirmgrößen.
quelle
#define IS_IPHONE_5 ( [ [ UIScreen mainScreen ] bounds ].size.height == 568 )
DBL_EPSILON
hier nicht erforderlich ist und dass der==
Vergleich nicht fehlschlägt: Ein Vergleich mit Differenzen auf diese Weise ist nur erforderlich, wenn der Gleitkommawert nicht als exakte Zahl ausgedrückt werden kann (wie1.0/3.0*3.0
zum Beispiel). Lesen Sie diesen Artikel für weitere Informationen;)Getestet und entwickelt für jede Kombination von SDK und Betriebssystem:
Schnell
IPad-Typen hinzugefügt. iPad 2 und iPad mini sind iPads ohne Netzhaut. Während iPad Mini 2 und höher, haben iPad 3, 4, iPad Air, Air 2, Air 3 und iPad Pro 9.7 dieselbe logische Auflösung von 1024. iPad Pro hat eine maximale Länge von 1366. Referenz
Sehen Sie es in Aktion https://gist.github.com/hfossli/bc93d924649de881ee2882457f14e346
Hinweis: Wenn sich z. B. das iPhone 6 im gezoomten Modus befindet, ist die Benutzeroberfläche eine vergrößerte Version des iPhone 5. Diese Funktionen bestimmen nicht den Gerätetyp, sondern den Anzeigemodus. Daher ist das iPhone 5 in diesem Beispiel das gewünschte Ergebnis.
Ziel c
Verwendung: http://pastie.org/9687735
Hinweis: Wenn sich z. B. das iPhone 6 im gezoomten Modus befindet, ist die Benutzeroberfläche eine vergrößerte Version des iPhone 5. Diese Funktionen bestimmen nicht den Gerätetyp, sondern den Anzeigemodus. Daher ist das iPhone 5 in diesem Beispiel das gewünschte Ergebnis.
quelle
#define IS_RETINA ([[UIScreen mainScreen] scale] == 2.0)
die helfen wird, den Unterschied zwischen iPhone4 und iPhone5 und iPad Retina und Nicht-Retina zuSCREEN_MAX_LENGTH
, um 568 in allen Umdrehungen auf dem iPhone 5 zu erhalten.Wirklich einfache Lösung
quelle
Wir müssen jetzt die Bildschirmgrößen für iPhone 6 und 6Plus berücksichtigen. Hier ist eine aktualisierte Antwort
Einige nützliche Informationen
quelle
Ich habe mir die Freiheit genommen, das Makro von Macmade in eine C-Funktion zu setzen und es richtig zu benennen, da es die Breitbildverfügbarkeit erkennt und NICHT unbedingt das iPhone 5.
Das Makro erkennt auch nicht, dass es auf einem iPhone 5 ausgeführt wird, wenn das Projekt nicht die [email protected] enthält . Ohne das neue Standardbild meldet das iPhone 5 eine normale Bildschirmgröße von 480 x 320 (in Punkten). Die Überprüfung betrifft also nicht nur die Breitbildverfügbarkeit, sondern auch den aktivierten Breitbildmodus .
quelle
inline
d sein. Sie werden auch dort eingefügt, wo der Optimierer des Compilers dies für eine gute Idee hält und wo er wissen kann, dass dies zulässig ist (z. B. befindet sich die Funktion im selben Modul). Das Implementieren solcher Dinge über eine Funktion kann manchmal eine zusätzliche Typprüfung mit sich bringen.Hier sind unsere Codes, Test auf ios7 / ios8 für iphone4, iphone5, ipad, iphone6, iphone6p bestanden, egal auf Geräten oder Simulator:
quelle
Ich habe die Antwort von hfossli verwendet und sie in Swift übersetzt
quelle
Dies ist das Makro für mein cocos2d-Projekt. sollte für andere Apps gleich sein.
quelle
quelle
In Swift, iOS 8+ Projekt möchte ich eine Erweiterung machen
UIScreen
, wie:(HINWEIS:
nativeBounds
ist in Pixel).Und dann lautet der Code wie folgt:
Der Code macht also deutlich, dass dies eine Überprüfung für den Hauptbildschirm ist, nicht für das Gerätemodell.
quelle
In Anlehnung an die Antwort von Samrat Mazumdar finden Sie hier eine kurze Methode, mit der die Bildschirmgröße des Geräts geschätzt wird. Es funktioniert mit den neuesten Geräten, kann jedoch bei zukünftigen Geräten fehlschlagen (wie bei allen Vermutungsmethoden). Es wird auch verwirrt, wenn das Gerät gespiegelt wird (gibt die Bildschirmgröße des Geräts zurück, nicht die gespiegelte Bildschirmgröße).
quelle
Ich denke, es sollte gut sein, wenn dieses Makro in Gerät und Simulator funktioniert, unten sind die Lösung.
quelle
Ich habe festgestellt, dass die Antworten keinen Sonderfall für Simulatoren enthalten.
quelle
quelle
iPhone5 = FALSE;
ist unnötig, weil die Variable bereits diesen Wert hat, wenn sie nicht geändert wirdquelle
Sich auf die Größe zu verlassen ist in so vielen Ebenen falsch. Wie wäre es, wenn wir das System fragen?
Entnommen aus dem besten Weg, um Hardwaretyp, iPhone4 oder iPhone5 zu erkennen? , edzio27 Antwort.
quelle
Auf diese Weise können Sie die Gerätefamilie erkennen.
quelle
Wenn das Projekt mit Xcode 6 erstellt wurde, verwenden Sie den unten angegebenen Code, um die Geräte zu erkennen.
Wenn das Projekt in Xcode 5 erstellt und in Xcode 6 geöffnet wurde, verwenden Sie den unten angegebenen Code, um die Geräte zu erkennen. (Dieser Code funktioniert, wenn keine Startbilder für das iPhone 6,6+ zugewiesen sind.)
Wenn Sie immer noch Xcode 5 zusammen verwenden, verwenden Sie den folgenden Code, um die Geräte zu erkennen (iPhone 6 und 6+ werden nicht erkannt).
quelle
Fügen Sie eine 'Neue Swift-Datei' hinzu ->
AppDelegateEx.swift
Fügen Sie eine Erweiterung hinzu
AppDelegate
Verwendung:
quelle
In Swift 3 können Sie meine einfache Klasse KRDeviceType verwenden.
https://github.com/ulian-onua/KRDeviceType
Es ist gut dokumentiert und unterstützt Operatoren ==,> =, <=.
Um beispielsweise festzustellen, ob das Gerät an iPhone 6 / 6s / 7 gebunden ist, können Sie einfach den nächsten Vergleich verwenden:
Um festzustellen, ob das Gerät an iPhone 5 / 5S / SE oder früher (iPhone 4s) gebunden ist, können Sie den nächsten Vergleich verwenden:
quelle
Dies wurde hundertmal beantwortet, aber diese Lösung hat für mich am besten funktioniert und dazu beigetragen, das Problem zu beheben, wenn neue Geräte eingeführt werden und ich keine Größe definiert habe.
Swift 5 Helfer:
Dies liegt daran, dass es einfach ist, sich die Zollgrößen eines Telefons zu merken, z. B. "5,5 Zoll" oder "4,7 Zoll", aber es ist schwierig, sich die genauen Pixelgrößen zu merken.
Dies gibt Ihnen auch die Möglichkeit, Folgendes zu tun:
Die Standardeinstellung: versucht, die Bildschirmgröße und -skalierung zu verwenden, um die diagonalen Zoll zu berechnen. Wenn eine neue Gerätegröße angezeigt wird, wird versucht, das Beste zu ermitteln, und der Code, wie im letzten Beispiel, sollte weiterhin funktionieren.
quelle
Verwenden Sie den folgenden Code:
quelle
Hier ist der richtige Test des Gerätes, unabhängig von der Ausrichtung
quelle
Wird verwendet, um iPhone- und iPad-Geräte aller Art zu erkennen.
quelle
IS_RETINA
auf einem iPhone 6 plus getestet , wird 1x Code ausgeführt?@1x
, wo sie nachgeben sollten@3x
. sowieso: wie Sie einfach kopieren und