Wenn der Code im Simulator funktioniert, aber auf dem echten Gerät abstürzt: UI_USER_INTERFACE_IDIOM() in Swift verstehen
\n\nHaben Sie jemals eine App geschrieben, die auf dem iPhone 14 Pro Simulator perfekt aussieht, aber auf dem iPad Mini zu einem Chaos wird? Oder umgekehrt – Ihre moderne iPad-Oberfläche verrutscht auf einem alten iPod touch? Ein bekanntes Problem, oder?
\n\niOS-Entwickler stehen oft vor der Notwendigkeit herauszufinden, auf welchem Gerät die App läuft. Das klingt einfach, aber der Teufel steckt wie immer im Detail. Die legendäre Frage auf Stack Overflow zu UI_USER_INTERFACE_IDIOM() hat tausende Aufrufe gesammelt – das zeigt, dass selbst erfahrene Programmierer manchmal über die Nuancen stolpern.
In diesem Artikel erklären wir alles, was Sie über die Geräteerkennung in Swift wissen müssen. Kein unnötiges Blabla – nur Praxis, lebendige Beispiele und Antworten auf die häufigsten Fragen.
\n\nWas ist UI_USER_INTERFACE_IDIOM() und warum wird darüber gesprochen?
\n\nEs ist eine altbewährte Funktion aus der Objective-C-Ära. Sie gibt einen Wert vom Typ UIUserInterfaceIdiom zurück, der angibt, um welchen Gerätetyp es sich handelt: iPhone, iPad, TV oder CarPlay.
So sah es im klassischen Objective-C aus:
\n\nif (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {\n // Es ist ein iPad\n} else {\n // Es ist ein iPhone oder iPod touch\n}\n\nAber Swift ist eine strengere und sicherere Sprache. Die direkte Verwendung dieser C-Funktion ist nicht immer praktisch. Abgelöst wurde sie durch den moderneren Ansatz über UIDevice.current.
Wie erkennt man ein Gerät in Swift richtig: Zwei funktionierende Methoden
\n\nMethode Nr. 1 – Klassiker über UIDevice (empfohlen):
import UIKit\n\nlet deviceIdiom = UIDevice.current.userInterfaceIdiom\n\nswitch deviceIdiom {\ncase .phone:\n print("Es ist ein iPhone oder iPod touch")\ncase .pad:\n print("Es ist ein iPad")\ncase .tv:\n print("Es ist ein Apple TV")\ncase .carPlay:\n print("Es ist CarPlay")\ncase .mac:\n print("Es ist Mac Catalyst oder Mac")\n@unknown default:\n print("Unbekanntes Gerät (möglicherweise zukünftig)")\n}\n\nWichtig: Der Fall .mac wurde mit iOS 14+ eingeführt. Wenn Ihre App ältere Versionen unterstützt, verwenden Sie @unknown default, um zukünftige Typen zu behandeln.
Methode Nr. 2 – Kompatibilität mit Objective-C-Code (falls nötig):
\n\nif UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiom.phone {\n print("Wir arbeiten auf einem Telefon")\n}\n\nBeide Varianten sind korrekt, aber die erste ist idiomatischer für Swift.
\n\nHäufige Fragen und Fallstricke
\n\n1. Warum wird auf dem iPad mini ein iPhone erkannt?
\n\nDas ist die häufigste Frage. Sie starten die App auf einem iPad mini, aber userInterfaceIdiom gibt hartnäckig .phone zurück. Woran liegt das?
Die Antwort ist einfach und nicht offensichtlich: Skalierungsmodus (Scale Mode). Wenn in den Einstellungen Ihrer App (Target → General → Deployment Info) der Modus "iPhone" ausgewählt ist, emuliert selbst ein physisches iPad ein iPhone.
\n\nLösung: Überprüfen Sie Ihre Projekteinstellungen.
\n- \n
- Gehen Sie zum Target Ihrer App \n
- General → Deployment Info \n
- Devices: Wählen Sie "Universal" (wenn die App auf allen Geräten laufen soll) \n
Wenn Sie "iPhone Only" ausgewählt haben, läuft die App auf dem iPad im Kompatibilitätsmodus (wie auf einem großen iPhone), und idiom wird .phone sein.
2. Wie unterscheidet man iPhone vom iPod touch?
\n\nUI_USER_INTERFACE_IDIOM() unterscheidet nicht zwischen iPhone und iPod touch – beide geben .phone zurück. Für die genaue Modellbestimmung müssen Sie UIDevice.current.model oder modelName über sysctl verwenden.
Beispiel einer Erweiterung zur genauen Modellnamen-Ermittlung:
\n\nimport UIKit\n\nextension UIDevice {\