Der erste Bildschirm meiner Anwendung ist ein Bildschirm UITableViewController
ohne Navigationsleiste. Dies bedeutet, dass der Inhalt unter der Statusleiste angezeigt wird , sodass viele Textkollisionen auftreten. Ich habe sowohl die Eigenschaften für Under top bars
als auch Adjust scroll view insets
die Eigenschaften angepasst, die das Scrollen unter verhindern, jedoch auf Kosten der Beibehaltung des oberen Bereichs der Tabellenansicht. Ich habe versucht, den UITableView
Frame so einzustellen , dass er um 20 Pixel versetzt ist, aber er scheint nicht wirksam zu werden. Da die App derzeit mit iOS 6 kompatibel sein muss, kann ich nicht zu iOS 7-Storyboards springen, um die Verwendung des automatischen Layouts zu erzwingen die obere Höhenführung. Hat jemand eine Lösung gefunden, die für beide Versionen funktioniert?
Dinge, die ich versucht habe: Einstellungen edgesForExtendedLayout
, Ändern der Einstellungen in Storyboard für Under top bars
und Adjust scroll view
Erzwingen des Rahmens in einem neuen Bereich.
Ein Bild sagt mehr als tausend Worte:
quelle
UITableView
Header, der auch unter der Statusleiste fließt.Antworten:
Wenn Sie dies replizieren möchten, führen Sie einfach die folgenden Schritte aus:
UIViewController
UITableViewController
aus der ObjektbibliothekWenn Sie beim Ausführen der App die oben genannten Schritte ausführen, werden Sie feststellen, dass nichts, einschließlich der Optimierung der Kontrollkästchen von Xcode auf "Kanten unter {oberen, unteren, undurchsichtigen} Balken erweitern", verhindert, dass die erste Zeile unter der Statusleiste angezeigt wird. Sie können dies auch nicht programmgesteuert angehen.
ZB Im obigen Szenario hat Folgendes keine Auswirkung:
Dieses Problem kann sehr frustrierend sein, und ich glaube, es ist ein Fehler von Apple, insbesondere weil es in der eigenen vorverdrahteten
UITableViewController
Objektbibliothek angezeigt wird.Ich bin nicht einverstanden mit allen, die versuchen, dies durch die Verwendung einer beliebigen Form von "Magic Numbers" zu lösen, z. B. "Verwenden Sie ein Delta von 20 Pixel". Diese Art der eng gekoppelten Programmierung ist definitiv nicht das, was Apple von uns hier verlangt.
Ich habe zwei Lösungen für dieses Problem gefunden:
Die Erhaltung der
UITableViewController
‚s Szene :Wenn Sie das behalten mögen
UITableViewController
im Storyboard, ohne es in einer anderen Ansicht manuell zu platzieren, können Sie das einbettenUITableViewController
in einemUINavigationController
(Editor> Embed In> Navigation Controller) und deaktivieren‚Shows Navigation Bar‘im Inspektoren . Dies löst das Problem, ohne dass zusätzliche Anpassungen erforderlich sind, und bewahrt auch IhreUITableViewController
Szene im Storyboard.Verwenden von AutoLayout und Einbetten von
UITableView
in eine andere Ansicht (ich glaube, Apple möchte, dass wir dies tun) :Erstellen Sie ein leeres
UIViewController
und ziehen SieUITableView
es hinein. Ziehen Sie dann bei gedrückter Strg-Taste von IhrerUITableView
in die Statusleiste. Wenn sich die Maus am unteren Rand der Statusleiste befindet, wird eine Autolayout-Blase mit der Aufschrift "Top Layout Guide" angezeigt. Lassen Sie die Maus los und wählen Sie "Vertikaler Abstand". Dadurch wird das Layoutsystem angewiesen, es direkt unter der Statusleiste zu platzieren.Ich habe beide Methoden an einer leeren Anwendung getestet und beide funktionieren. Möglicherweise müssen Sie einige zusätzliche Anpassungen vornehmen, damit sie für Ihr Projekt funktionieren.
quelle
Wenn Sie programmgesteuert arbeiten und a
UITableViewController
ohne verwenden,UINavigationController
ist es am besten, wenn Sie Folgendes tunviewDidLoad
:Swift 3
Früher Swift
Der
UITableViewController
Bildlauf wird weiterhin hinter der Statusleiste angezeigt, befindet sich jedoch nicht darunter, wenn Sie nach oben scrollen.quelle
topLayoutGuide
stattdessen die Länge.UIApplication.sharedApplication.statusBarFrame.size.height
anstelle von 20 verwenden.Bitte beachten Sie: Dies funktionierte bei mir für die folgende Konfiguration:
Wenn die beiden oben genannten Anforderungen nicht erfüllt sind, kann Ihre Laufleistung variieren.
Ursprünglicher Beitrag
Ich habe meine Ansicht programmgesteuert erstellt und dies hat für mich funktioniert:
Quelle (im Abschnitt topLayoutGuide unten auf Seite 39).
quelle
Zur obersten Antwort hinzufügen:
Nachdem die 2. Methode anfangs nicht zu funktionieren schien, bastelte ich weiter und habe die Lösung gefunden.
TLDR; Die zweite Lösung der oberen Antwort funktioniert fast, aber für einige Versionen von xCode Strg + Ziehen zu "Top Layout Guide" und Auswählen des vertikalen Abstands führt zu nichts. Wenn Sie jedoch zuerst die Größe der Tabellenansicht anpassen und dann "Top Space to Top Layout Guide" auswählen, funktioniert dies
Ziehen Sie einen leeren ViewController auf das Storyboard.
Ziehen Sie ein UITableView- Objekt in die Ansicht. (Nicht UITableViewController). Positionieren Sie es mit den blauen Layout-Hilfslinien genau in der Mitte.
Erstellen Sie Ihre benutzerdefinierte Unterklasse von UIViewController und fügen Sie die
<UITableViewDataSource, UITableViewDelegate>
Protokolle hinzu. Vergessen Sie nicht, den ViewController Ihres Storyboards im Identitätsinspektor auf diese Klasse einzustellen.Erstellen Sie eine Steckdose für Ihre TableView in Ihrer Implementierungsdatei und nennen Sie sie "tableView".
Nun zum Teil, nicht in die Statusleiste zu schneiden.
Jetzt können Sie Ihre Tabellenansicht wie gewohnt einrichten und die Statusleiste wird nicht abgeschnitten!
quelle
https://developer.apple.com/library/ios/documentation/userexperience/conceptual/TransitionGuide/SupportingEarlieriOS.html#//apple_ref/doc/uid/TP40013174-CH14-SW1
quelle
self.topLayoutGuide.length
vonviewDidLayoutSubviews
wird das Layout der untergeordneten Ansichten durcheinander gebracht.Wählen Sie UIViewController in Ihrem Storyboard aus und deaktivieren Sie die Option Kanten unter oberen Balken erweitern. Hat für mich gearbeitet. :)
quelle
So schreibt man es in "Swift" Eine Anpassung an @ lipkas Antwort:
quelle
- (void)viewDidLayoutSubviews { if (self.tableView.contentInset.top != self.topLayoutGuide.length) { self.tableView.contentInset = UIEdgeInsetsMake(self.topLayoutGuide.length, 0.0, 0.0, 0.0); } }
Bei Xcode 7 hat es für mich funktioniert, das Häkchen für die Navigationsleiste zu deaktivieren.
quelle
Dies behebt das Problem für einen UITableViewController (ohne magische Zahlen). Das einzige, was ich nicht beheben konnte, war, wenn Sie gerade telefonieren. In diesem Fall wird die Oberseite der Tabellenansicht zu stark nach unten gedrückt. Wenn jemand weiß, wie man das löst, lassen Sie es uns bitte wissen.
quelle
Ich weiß nicht, wie koscher es ist, aber ich habe festgestellt, dass dieses Schema die Ansicht des ViewControllers nach unten verschiebt und der Statusleiste einen soliden Hintergrund bietet:
Ersetzen
redColor
Sie natürlich die gewünschte Farbe für den Hintergrund.Sie müssen einen der Swizzles separat ausführen, um die Farbe der Zeichen / Symbole in der Statusleiste festzulegen. Ich benutze
View controller-based status bar appearance = NO
undStatus bar style = Opaque black style
in der Liste, um dies global zu tun.Scheint zu funktionieren, und ich wäre interessiert, von Fehlern oder Problemen damit zu hören.
quelle
Die Antwort von chappjc funktioniert hervorragend, wenn Sie mit XIBs arbeiten.
Ich fand die sauberste Lösung beim programmgesteuerten Erstellen von TableViewControllern darin, die UITableViewController-Instanz in einen anderen UIViewController zu verpacken und entsprechende Einschränkungen festzulegen.
Hier ist es:
Prost, Ben
quelle
Ich denke, der Ansatz zur Verwendung von UITableViewController unterscheidet sich möglicherweise ein wenig von dem, was Sie zuvor getan haben. Es hat bei mir funktioniert, aber Sie sind vielleicht kein Fan davon. Ich habe einen View Controller mit einer Containeransicht, die auf meinen UItableViewController verweist. Auf diese Weise kann ich den TopLayoutGuide verwenden, der für mein In-Storyboard bereitgestellt wird. Fügen Sie einfach die Einschränkung zur Containeransicht hinzu, und Sie sollten sich sowohl um iOS7 als auch um iOS6 kümmern.
quelle
Am Ende habe ich eine zusätzliche Ansicht mit dem gewünschten Hintergrund verwendet, die nach TableView hinzugefügt und unter der Statusleiste platziert wurde:
Es ist nicht sehr hübsch, aber es ist eine ziemlich einfache Lösung, wenn Sie mit xib-freien Ansichten und sowohl IOS6 als auch IOS7 arbeiten müssen
quelle
Ich habe dies für Retina / Non-Retina-Anzeige als getan
quelle
Die folgende Lösung funktioniert im Code gut genug, ohne magische Konstanten zu verwenden, und berücksichtigt, dass der Benutzer die Größenklasse ändert, z. B. durch Rotationen oder Side-by-Side-Apps auf iPads:
quelle
Funktioniert für schnelle 3 - In viewDidLoad ();
Dieser Code: 1. Ruft die Höhe der Statusleiste ab. 2. Gibt dem oberen Rand der Tabellenansicht einen Inhaltseinsatz, der der Höhe der Statusleiste entspricht. 3. Verleiht der Bildlaufanzeige den gleichen Einschub, sodass sie unter der Statusleiste angezeigt wird.
quelle
Für diejenigen wie mich, die ihre lieber nicht
UITableViewController
in einenUIViewController
Versuch einbetten möchten :Eine benutzerdefinierte
UITableViewController
Unterklasse kann eine Maskenansicht an die Übersicht der Tabellenansicht anhängen. Fügen Sie die Maske in viewDidAppear hinzu und entfernen Sie die Maske in viewWillDisappear.quelle
Ich hatte eine UISearchBar oben in meiner UITableView und die folgenden funktionierten;
Teile und genieße...
quelle
Ich habe es geschafft, indem ich die Größe auf Freiform eingestellt habe
quelle
Abrahamchez 'Lösung https://developer.apple.com/library/ios/qa/qa1797/_index.html funktionierte für mich wie folgt. Ich hatte einen einzelnen UITableviewcontroller als erste Ansicht. Ich hatte den Offset-Code ausprobiert und in ein Navcon eingebettet, aber weder die Transparenz der Statusleiste gelöst.
Fügen Sie einen Viewcontroller hinzu und machen Sie ihn zur ersten Ansicht. Dies sollte Ihnen wichtige Leitfäden für das obere und untere Layout anzeigen.
Ziehen Sie die alte Tabellenansicht in die Ansicht des neuen Controllers.
Führen Sie alle erforderlichen Schritte aus, um die Tabelle in den neuen Controller nachzurüsten:
Ändern Sie Ihre alte Datei view controller.h so, dass sie von UIViewController anstelle von UITableViewController erbt / unterklassifiziert.
Fügen Sie UITableViewDataSource und UITableViewDelegate zur .h des viewcontrollers hinzu.
Verbinden Sie alle im Storyboard benötigten Elemente erneut, z. B. eine Suchleiste.
Das Wichtigste ist, die Einschränkungen wie in den Apple-Fragen und Antworten festzulegen. Ich habe mir nicht die Mühe gemacht, eine Symbolleiste einzufügen. Nicht sicher die genaue Reihenfolge. Aber ein rotes Symbol erschien in den Layout-Handbüchern, vielleicht als ich gebaut habe. Ich habe darauf geklickt und Xcode die Einschränkungen installieren / bereinigen lassen.
Dann habe ich überall geklickt, bis ich die vertikale Raumbeschränkung gefunden und ihren Spitzenwert von -20 auf 0 geändert habe, und es hat perfekt funktioniert.
quelle
Ich verwende einen UISplitViewController mit einem Navigationscontroller und einem Tableviewcontroller. Dies funktionierte für mich in der Master-Ansicht, nachdem ich hier viele Lösungen ausprobiert hatte:
Es ähnelt der Lösung von Hot Licks, wendet jedoch die Unteransicht auf den Navigationscontroller an.
quelle
quelle
Hier ist ein Swift 2.3. (Xcode 8.0) Lösung. Ich habe eine Unterklasse von UITableView erstellt.
Der Inhaltseinsatz sollte immer Null sein (standardmäßig). Ich setze es manuell auf Null. Sie können auch eine Prüfmethode hinzufügen, mit der die Prüfung durchgeführt wird. Wenn es sich um eine andere als die gewünschte Methode handelt, erhalten Sie einfach die richtige Korrektur. Die Änderung wird nur angezeigt, wenn die Tabellenansicht gezeichnet wird (was nicht häufig vorkommt).
Vergessen Sie nicht, die TableView in Ihrem IB zu aktualisieren (im TableViewController oder nur in TableView in Ihrem ViewController).
quelle
Ich hatte dieses Problem in iOS 11, aber das Layout war für iOS 8 - 10.3.3 korrekt. Für meinen Fall habe ich eine vertikale Raumbeschränkung auf Superview.Top Margin anstelle von Superview.Top gesetzt, was für ios 8 - 11 funktioniert.
quelle
Ich habe den einfachsten Weg gefunden, dies zu tun, insbesondere wenn Sie Ihre Tabellenansicht innerhalb der Registerkartenleiste hinzufügen, indem Sie zuerst eine Ansicht und dann die Tabellenansicht in dieser Ansicht hinzufügen . Dies gibt Ihnen die oberen Randführungen, die Sie suchen.
quelle
Alle Lösungen anzeigen: Mein Projekt verwendet nur xib, daher hat die Lösung mit Storyboard bei mir nicht funktioniert. self.edgesForExtendedLayout = UIRectEdgeNone; Funktioniert nur für den Controller, wenn die Navigationsleiste sichtbar ist. Wenn Ihre Ansicht jedoch nur eine Statusleiste enthält, funktioniert dies nicht. Also kombiniere ich zwei Bedingungen.
hilf das funktioniert.
quelle
Wenn Sie auch iOS 6 unterstützen müssen, müssen Sie es bedingt nach unten verschieben. Das heißt, in iOS 7 sollten Sie es nur um 20 Punkte nach unten verschieben (entweder durch
frame
Manipulation oder mithilfe des automatischen Layouts), und in iOS 6 lassen Sie es in Ruhe. Ich glaube nicht, dass Sie dies in IB tun können, also müssen Sie es in Code tun.BEARBEITEN
Sie können dies tatsächlich in IB tun, indem Sie die iOS6 / iOS7-Deltas verwenden. Stellen Sie Ihre Position in iOS 7 ein und setzen Sie dann für iOS 6 das Delta Y auf -20 Punkte. Weitere Informationen finden Sie in dieser SO-Frage .
quelle
self.view.frame
undself.tableView.frame
in beidenviewWillAppear
undviewDidLoad
. Um sicher zu gehen, habe ich auchsetContentNeedsDisplay
ein Neuzeichnen erzwungen.