Hat jemand ein Problem mit dem iPhone X-Simulator rund um die UITabBar-Komponente?
Meins scheint die Symbole und den Titel übereinander zu rendern. Ich bin mir nicht sicher, ob mir etwas fehlt. Ich habe es auch im iPhone 8-Simulator ausgeführt und auf einem tatsächlichen Gerät, auf dem es gut aussieht, wie auf dem abgebildet Storyboard.
iPhone X:
iPhone 8
Antworten:
Ich konnte das Problem umgehen, indem ich einfach invalidateIntrinsicContentSize in der UITabBar in viewDidLayoutSubviews aufrief.
Hinweis: Der untere Rand der Registerkartenleiste muss sich im unteren Bereich der Hauptansicht befinden und nicht im sicheren Bereich. Die Registerkartenleiste sollte keine Höhenbeschränkung aufweisen.
quelle
[self.view layoutIfNeeded]
.landscapeImage
Eigenschaft der Schaltfläche in der Registerkartenleiste festlegen können . Empfohlene Größen finden Sie in [Apple HIG's] ( developer.apple.com/design/human-interface-guidelines/ios/… ) unter BenutzerdefinierteDie von VoidLess bereitgestellte Antwort behebt TabBar-Probleme nur teilweise. Es behebt Layoutprobleme in der Registerkartenleiste. Wenn Sie jedoch einen Ansichtscontroller verwenden, der die Registerkartenleiste ausblendet, wird die Registerkartenleiste während der Animationen falsch gerendert (um sie zu reproduzieren, sollten Sie 2 Segmente haben - einen modalen und einen Push. Wenn Sie die Segmente abwechseln, können Sie dies tun siehe, dass die Tab-Leiste nicht richtig gerendert wird). Der folgende Code behebt beide Probleme. Gute Arbeit Apfel.
Ziel-C-Code:
quelle
Es gibt einen Trick, mit dem wir das Problem lösen können.
Das funktioniert wirklich für mich.
Oder folgen Sie diesem Link für weitere Details.
quelle
überschreiben
UITabBar
sizeThatFits(_)
für safeAreaquelle
Ich habe dies zu
viewWillAppear
meinem Brauch hinzugefügtUITabBarController
, da keine der bereitgestellten Antworten für mich funktioniert hat:quelle
Ich hatte das gleiche Problem.
Wenn ich eine Konstante ungleich Null für die untere Einschränkung der UITabBar auf den sicheren Bereich setze:
Es beginnt wie erwartet zu funktionieren ...
Das ist die einzige Änderung, die ich vorgenommen habe, und ich habe keine Ahnung, warum es funktioniert, aber wenn jemand es tut, würde ich es gerne wissen.
quelle
Das Verschieben der Registerkartenleiste um 1 Punkt von unten hat bei mir funktioniert.
Natürlich erhalten Sie dadurch eine Lücke, die Sie auf irgendeine Weise füllen müssen, aber der Text / die Symbole sind jetzt richtig positioniert.
quelle
Aha! Es ist tatsächlich Magie!
Ich habe das endlich herausgefunden, nachdem ich stundenlang Apple verflucht hatte.
UIKit erledigt dies tatsächlich für Sie und es scheint, dass die verschobenen Registerkartenleistenelemente auf eine falsche Einrichtung zurückzuführen sind (und wahrscheinlich auf einen tatsächlichen UIKit-Fehler). Es ist keine Unterklasse oder Hintergrundansicht erforderlich.
UITabBar funktioniert "nur", wenn es auf den unteren Bereich der Übersicht beschränkt ist, NICHT auf den unteren sicheren Bereich .
Es funktioniert sogar im Interface Builder.
Richtiges Setup
Manchmal funktioniert es immer noch nicht
Was wirklich dumm ist, ist, dass Sie den Fehler auch in IB tatsächlich sehen können, selbst wenn Sie die genauen Einschränkungen hinzufügen, die IB in den obigen Schritten hinzufügt!
quelle
Behoben durch die Verwendung von UITabBar in Unterklassen zum Anwenden von safeAreaInsets:
quelle
Für mich gelöst, indem ich anrufe,
[tabController.view setNeedsLayout];
nachdem ich das Modal im Abschlussblock entlassen habe.quelle
Die UITabBar wird immer höher, um über der Home-Schaltfläche / Linie zu liegen. Sie zeichnet jedoch die Unteransicht an ihrer ursprünglichen Position und überlagert das UITabBarItem mit der Unteransicht.
Um dieses Problem zu umgehen, können Sie das iPhone X erkennen und dann die Höhe der Ansicht um 32 Pixel verkleinern, um sicherzustellen, dass die Registerkartenleiste im sicheren Bereich über der Startlinie angezeigt wird.
Wenn Sie beispielsweise Ihre TabBar programmgesteuert erstellen, ersetzen Sie sie
Mit diesem:
HINWEIS: Dies kann durchaus ein Fehler sein, da die Ansichtsgrößen und das Layout der Registerkartenleiste vom Betriebssystem festgelegt werden. Es sollte wahrscheinlich gemäß dem Screenshot von Apple in den Richtlinien für die Benutzeroberfläche des iPhone X hier angezeigt werden: https://developer.apple.com/ios/human-interface-guidelines/overview/iphone-x/
quelle
Mein Fall war, dass ich in meinem UITabBarController eine benutzerdefinierte UITabBar-Höhe festgelegt hatte:
Das Entfernen dieses Codes war die Lösung für die korrekte Anzeige der TabBar auf dem iPhone X.
quelle
Die einfachste Lösung, die ich gefunden habe, bestand darin, einfach einen Abstand von 0,2 pt zwischen dem unteren Rand der Registerkartenleiste und dem unteren Rand des safeAreaLayoutGuide.bottomAnchor hinzuzufügen.
quelle
Ich hatte das gleiche Problem, als ich versuchte, den Rahmen von UITabBar in meinem benutzerdefinierten TabBarController festzulegen.
Als ich es gerade auf die neue Größe eingestellt habe, ist das Problem behoben
quelle
kPhoneXTabBarHeight
?Ich habe dies heute mit einer UITabBar festgestellt, die manuell zum Ansichts-Controller im Storyboard hinzugefügt wurde. Wenn ich mich mit einer Konstante von 0 am unteren Rand des sicheren Bereichs ausrichte, wird das Problem angezeigt, aber wenn ich es auf 1 ändere, wird das Problem behoben. Die UITabBar um 1 Pixel höher als normal zu haben, war für meine Anwendung akzeptabel.
quelle
Ich habe mir über dieses Problem den Kopf gekratzt. Es scheint damit verbunden zu sein, wie die tabBar initialisiert und zur Ansichtshierarchie hinzugefügt wird. Ich habe auch die oben genannten Lösungen wie Aufrufen
invalidateIntrinsicContentSize
, Festlegen des Frames und auchbottomInsets
innerhalb einer UITabBar-Unterklasse ausprobiert. Sie scheinen jedoch vorübergehend zu funktionieren und brechen ein anderes Szenario ab oder regressieren die Registerkartenleiste, indem sie ein mehrdeutiges Layoutproblem verursachen. Als ich das Problem debuggte, habe ich versucht, die Höhenbeschränkungen der UITabBar und centerYAnchor zuzuweisen, aber beide haben das Problem nicht behoben. Im View-Debugger wurde mir klar, dass die TabBar-Höhe vor und nach der Reproduktion des Problems korrekt war, was mich zu der Annahme veranlasste, dass das Problem in den Unteransichten lag. Ich habe den folgenden Code verwendet, um dieses Problem erfolgreich zu beheben, ohne ein anderes Szenario zu regressieren.Annahmen: Ich mache dies nur für das iPhone X, da es derzeit auf keinem anderen Gerät reproduziert zu werden scheint. Basiert auf der Annahme, dass Apple den Namen der UITabBarButton-Klasse in zukünftigen iOS-Versionen nicht ändert. Wir tun dies nur auf UITabBarButton, wenn Apple mehr interne Unteransichten zu UITabBar hinzufügt, müssen wir möglicherweise den Code ändern, um dies anzupassen.
Bitte lassen Sie mich wissen, ob dies funktioniert, offen für Vorschläge und Verbesserungen!
Es sollte einfach sein, dafür ein schnelles Äquivalent zu erstellen.
quelle
viewDidAppear(animated:)
in meinUITabBarController
und es hat gut funktioniert. Vielen Dank!Aus diesem Tutorial:
https://github.com/eggswift/ESTabBarController
und nach der Initialisierung der Registerkartenleiste wird diese Zeile in die Appdelegate-Klasse geschrieben
Löst mein Problem mit der Registerkartenleiste.
Hoffe, es löst Ihr Problem
Vielen Dank
quelle
Wählen Sie die Registerkarte und aktivieren Sie das Kontrollkästchen "Relative Ränder des Bereichs speichern" im Inspektor-Editor wie folgt:
quelle
Ich hatte das ähnliche Problem, zuerst wurde es korrekt gerendert, aber nach dem Einrichten
badgeValue
auf einem der tabBarItem wurde das Layout beschädigt. Was für mich ohne Unterklasse funktioniert hat,UITabBar
war dies in meiner bereits erstelltenUITabBarController
Unterklasse.Ich habe die tabBar-Übersicht verwendet, um sicherzustellen, dass sich die Einschränkungen / Anker in derselben Ansichtshierarchie befinden, und um Abstürze zu vermeiden.
Nach meinem Verständnis müssen wir, da dies ein UIKit-Fehler zu sein scheint, nur die Einschränkungen der Registerkartenleiste neu schreiben / neu festlegen, damit die automatische Layout-Engine die Registerkartenleiste wieder korrekt gestalten kann.
quelle
Wenn Sie Höhenbeschränkungen für die Registerkartenleiste haben, entfernen Sie diese.
Konfrontiert das gleiche Problem und das Entfernen dieses löste das Problem.
quelle
Ich habe einen neuen UITabBarController in meinem Storyboard erstellt und alle View Controller auf diesen neuen UITabBarConttoller verschoben. Also funktionieren alle gut im iPhone X Simulator.
quelle
Für das iPhone können Sie dies tun, Unterklasse UITabBarController.
Gehen Sie zum Storyboard und erlauben Sie Use Safe Area Layout Guide und ändern Sie die Klasse von UITabbarController in MyTabBarController
PS Diese Lösung wird nicht für universelle Anwendungen und iPad getestet.
quelle
Versuchen Sie, den Begrüßungsbildschirm mit der Größe @ 3x (3726 × 6624) zu ändern.
quelle
Entfernen Sie für mich die
[self.tabBar setBackgroundImage:]
Arbeit, vielleicht ist es ein UIKit-Fehlerquelle
Für mich hat dies alle Probleme behoben:
quelle
Ich habe ein
UITabBarController
im Storyboard verwendet und es funktionierte zunächst in Ordnung für mich, aber nach dem Upgrade auf eine neuere Xcode-Version gab es Probleme mit der Höhe der Registerkartenleiste.Für mich bestand die Korrektur darin, das vorhandene
UITabBarController
aus dem Storyboard zu löschen und durch Ziehen aus der Objektbibliothek des Interface Builder neu zu erstellen .quelle
Für diejenigen, die ganz
UITabBarController
programmgesteuert schreiben , können Sie die TitelpositionUITabBarItem.appearance().titlePositionAdjustment
anpassenWenn Sie also in diesem Fall eine Lücke zwischen Symbol und Titel hinzufügen möchten, verwenden Sie diese in
viewDidLoad
:Erkennen, ob das Gerät einen Notch-Bildschirm hat:
quelle
Ich hatte das gleiche Problem, das durch Festlegen der Elemente der Registerkartenleiste nach dem Anlegen der Registerkartenleiste behoben wurde.
In meinem Fall trat das Problem auf, wenn:
quelle
Ich denke, das ist ein Fehler UIKit von iPhoneX. weil es funktioniert:
quelle
Ich glaube, Sie legen möglicherweise die Registerkartenleiste gegen die untere sichere Layoutanleitung. Dies ist wahrscheinlich nicht das, was Sie möchten, da die Registerkartenleiste anscheinend ihre eigenen Berechnungen durchführt, um die Elemente der Registerkartenleiste sicher über der Startzeile im iPhone X zu positionieren . Richten Sie Ihre untere Einschränkung gegen die untere Ansicht ein . Sie sollten sehen, dass es sowohl auf dem iPhone X als auch auf anderen iPhones korrekt dargestellt wird .
quelle