wake-up-neo.com

Wie kann ich meinen iOS7 UITableViewController NICHT unter der oberen Statusleiste anzeigen lassen?

Mein Root-Controller ist ein TabBarController (Anwendung mit Registerkarten). Eine der Registerkarten ist ein UITableViewController. Wenn ich darauf umschalte und durch die Elemente scrolle, werden sie oben in der Statusleiste angezeigt (Signal, Batterie usw.). Das will ich nicht Ich möchte, dass das undurchsichtig ist oder ... etwas. Es ist visuell erschütternd, wenn der Text der Tabellenzellen das Statusmaterial unterlegt.

Kann ich das mit meinem Storyboard mit einigen Attributeinstellungen beheben, die ich nicht verstehe? Oder muss ich meinen Unterklassen einige Methoden hinzufügen? Oder vielleicht muss ich meinen UITableViewController mit einem anderen Controller umwickeln?

Ich habe auf der Seite mit den Storyboard-Attributen zahlreiche Variationen der Einstellungen für ViewController-Layout und Kantenerweiterung ausprobiert, aber es scheint keine davon zu ändern.

Update: Ich denke, mein Problem ist sehr ähnlich zu iOS 7: UITableView zeigt unter Statusleiste . Der einzige Unterschied besteht darin, dass ich in einen TabBarController eingebettet bin. Dieser Fall ist die Stammansicht. Ich habe versucht, die dort aufgelistete Lösung der Einbettung in eine NavigationController und die Einstellung von Show Navigation Bar auf False, aber es machte keinen Unterschied.

Screenshots:

Mein Storyboard (geschrumpft) zeigt einen Controller mit Registerkarten, mit zwei Kindern, einer einzelnen Ansicht und der anderen die Tabellenansicht.

Storyboard

Einstellungen für die Registerkartenleiste

tab bar controller settings

Einstellungen für den Table View Controller

table view controller settings

Wie die App auf meinem Telefon aussieht

enter image description here

Wie die Geschichte endete

Trotz der vielen Antworten funktionierte keine von ihnen wirklich. Irgendwie ein bisschen, aber nicht wirklich. Ich habe auch den Embed in NavigationController -Ansatz ausprobiert, und das hatte auch Probleme. Was aber funktionierte, war folgendes:

  1. Fügen Sie UIViewController hinzu
  2. Untergeordnete Controller-Beziehung festlegen und Registerkarten-Controller (genau wie die anderen beiden, die ich bereits hatte)
  3. Fügen Sie dem neuen UIViewController eine TableView (nicht Controller) hinzu, positionieren Sie sie wie gewünscht, sie rastet am unteren Rand der Statusleiste ein
  4. Legen Sie die delegate und tableSource der TableView als neuen Controller fest
  5. Erstellen Sie eine benutzerdefinierte UIViewController-Unterklasse und aktualisieren Sie den Klassentyp des Controllers im Storyboard
  6. Kopieren Sie die tabellenbezogenen Methoden aus meiner benutzerdefinierten UITableViewController-Unterklasse in meine neue Unterklasse
  7. Wählen Sie meine Prototyp-Tabellenzelle aus dem Original aus und ziehen Sie sie mit gedrückter Maustaste in die neue Tabellenansicht
  8. Glücklicherweise delete den ursprünglichen TableViewController (und den Wrapper NavigationController)
  9. Aktualisieren Sie das Element der Registerkartenleiste, um es an das vorherige anzupassen
  10. Chock ein anderes für "du versuchst zu hart"
33
Travis Griggs

Falls jemand den How the End -Abschnitt am Ende der (jetzt langen) Frage verpasst, lautet die kurze Antwort: Verwenden Sie einen einfachen UIViewController mit TableView , anstelle eines TableViewControllers, wenn Sie möchten das gesetzte Ziel erreichen.

2
Travis Griggs

Versuchen Sie dies in viewDidLoad:

self.tableView.contentInset = UIEdgeInsetsMake(20, 0, 0, 0);

20 px ist die Höhe der Statusleiste. Wenn Sie eine Navigationsleiste haben, verwenden Sie 64 anstelle von 20

33

Falls noch jemand diesen Thread liest:

Für mich funktionierte es auch, die Option "Kanten erweitern" in der übergeordneten Registerkartenleiste zu deaktivieren. Das ergibt ein konsistentes Verhalten in iOS7 und iOS6.

15
Florian

Ich hatte das gleiche Problem bei der Verwendung des SWRevealControllers. 

Mit den Kommentaren oben und unten konnte ich es zum Laufen bringen 

-(void)viewWillAppear instead of ViewDidLoad
     self.tableView.contentInset = UIEdgeInsetsMake(20, 0, 0, 0);
5
user3696154

Haben Sie versucht, der viewWillAppear-Methode des View-Controllers so etwas hinzuzufügen:

 if ([self respondsToSelector:@selector(setEdgesForExtendedLayout:)])
 {
    self.edgesForExtendedLayout = UIRectEdgeNone;
 }
4
Robert

Sie können dies auch über das Storyboard lösen.

Wählen Sie in der Projektgliederung (linke Seite des Editors) die Tabellenansicht aus, und wechseln Sie zu Eigenschaften (rechte Seite)> Registerkarte Größeninspektor> Bildlaufansicht> Inhaltseinsätze> Oben

2
Elsa

Ich habe folgendes zu viewWillAppear hinzugefügt

self.tableView.contentInset = UIEdgeInsetsMake(22, 0, 0, 0);
2
Brian Broom

Sieht so aus, als wollten Sie die NavBar nicht transversionslos machen, versuchen Sie es mit 

[self.navigationController.navigationBar setTranslucent:NO];
1
hv88

Ich bin auf das gleiche Problem gestoßen und die Lösung, die für mich funktioniert hat, war das Hinzufügen einer Abschnittskopfansicht: 

-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section

Ich fügte dann 20 zu Origin.y meines Texts in der Kopfzeile hinzu.

Ich habe dann die Kopfhöhe geändert, indem ich mit der 20 die ursprüngliche Höhe addierte 

-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
    return myHeight+20;
}
1
RYUX123

Mit iOS 8.4 kam ich mit den verschiedenen Storyboard-Optionen, die in anderen Antworten aufgeführt sind, nicht weiter.

Ich habe dieses Problem gelöst, ohne auf Dimensionskonstanten zurückgreifen zu müssen, indem ich eine reguläre Ansicht in meinen Tab-Controller legte und diese dann mit einer "Containeransicht" füllte, die ich dann mit einem UITableViewController mit einem "embed" -Segment verband.

Mein Tisch respektiert jetzt sowohl meine Navigationsleiste als auch die Tab-Leiste am unteren Rand.

1
bitmusher

nehmen Sie an, das @IBOutlet Ihrer Tabelle ist

 @IBOutlet var tableView: UITableView!

erstellen Sie eine Funktion prepareTable (). Fügen Sie die folgende Zeile in diese Methode ein

tableView.contentInset.top = UIApplication.shared.statusBarFrame.height

aufruf dieser Methode von ViewDidLoad ()

1
Dilip Jangid

Für mich war eine einfache Lösung (Code ist in C #, da scheint ungültig zu sein) ...

  1. Erstellen Sie einfach im UITableViewController-Konstruktor eine neue UIView (legen Sie dieselbe Dimension der TableView fest).

  2. Fügen Sie die TableView der neu erstellten Ansicht hinzu. 

  3. Neue erstellte Ansicht auf die View-Eigenschaft des UITableViewController setzen ...

Auf dem Konstruktor des UITableViewController

var view = new UIView ();
view.Frame = this.TableView.Frame;
view.AddSubview (this.TableView);

this.View = view;
1
Ricardo LR

Angenommen, Ihre Gliederungsansicht oder Ihr Storyboard ist ein Tab-Leisten-Controller, der derzeit über einen Table-View-Controller verfügt. Wenn Sie die App ausführen, werden Ihre Tabellenansicht-Zellen unter der Statusleiste ausgeführt, die einen transparenten Hintergrund zu haben scheint. Das ist scheiße!

Wenn Sie Stunden damit verbracht haben, alles, was Sie auf StackOverflow finden konnten, vergeblich zu probieren, hatten Sie das Gefühl, es wäre wirklich Zeit für eine neue Karriere? Klopfen Sie auf den Rücken, öffnen Sie das Elixier, das Sie in Zeiten wie dieser trinken, denn es ist nicht Ihre Schuld. Ja wirklich. Travis hat absolut Recht, dass keine Menge Code in viewDidLoad, viewWillAppear oder viewDidAppear oder das Auswählen/Abwählen von Schaltflächen in IB in dieser Situation hilfreich ist. 

Travis 'Lösung oben wird sicherlich funktionieren, aber es ist ein bisschen lang, es gibt etwas Kopieren und Einfügen von Code. Ich habe eine kurze Aufmerksamkeitsspanne, so dass sich eine Episode von Bugs Bunny für mich wie ein Film in voller Länge anfühlt, also weiß ich, dass ich werde alles vermasseln, was so kompliziert ist. Aber hey, der Kilometerstand kann unterschiedlich sein. Anyhoo ...

In Xcode 7.3 für eine App mit iOS 9 (ich nehme 7 und 8 an, aber ich weiß es nicht genau und bin derzeit zu faul, um es zu überprüfen). Es gibt einen einfacheren Weg, ohne Code schreiben zu müssen. Und das alles wird im Interface Builder von Xcode erledigt.

( Vorbehalt: Tut mir leid, wenn eine der Bedingungen nicht genau ist. Bitte lassen Sie mich wissen, wo ich mich geirrt habe, und korrigiere ich eventuelle Fehlbezeichnungen.)

  1. Wechseln Sie in den Utilities-Bereich des Interface Builder und wählen Sie die Objektbibliothek im Bibliotheksbereich aus.

  2. Wählen Sie ein Navigationsansicht-Controller-Objekt aus und ziehen Sie es in Ihre Storyboard-Szene. Sie werden bemerken, dass beim Ziehen zwei Szenenelemente angezeigt werden. Dies sind eine Navigations-Controller-Szene und eine Table-View-Controller-Szene. 

  3. Löschen Sie die doppelte Table View Controller-Szene, die mit der Navigations-Controller-Szene geliefert wurde.

  4. Wählen Sie die Beziehungsverbindung zwischen Ihrem Tab-Leisten-Controller und Ihrem Table View-Controller aus und klicken Sie auf "Löschen".

  5. Positionieren Sie den Navigationscontroller und den Table View Controller so, wie Sie es in Ihrem Storyboard möchten.

  6. Ziehen Sie bei gedrückter Strg-Taste von der Tab-Controller-Szene auf die Navigations-Controller-Szene, und wählen Sie "Relationship Segue, View Controller".

  7. Ziehen Sie bei gedrückter Strg-Taste von Ihrer Navigationscontroller-Szene zu Ihrer Table-View-Controller-Szene und wählen Sie "Relationship Segue, root view controller".

  8. Ziehen Sie schließlich in der Objektbibliothek der Dienstprogramme ein Navigationsobjekt in die Tabellenansicht der Table View Controller-Szene. 

Wenn Sie jetzt Ihre App ausführen, wird eine Navigationsleiste angezeigt, und die Zellen in der Tabellensicht werden nicht mehr unter einer transparenten Statusleiste angezeigt.

Hoffe das hilft.

0
Jim Hillhouse