iOS 7: UITableView wird in der Statusleiste angezeigt

219

Der erste Bildschirm meiner Anwendung ist ein Bildschirm UITableViewControllerohne Navigationsleiste. Dies bedeutet, dass der Inhalt unter der Statusleiste angezeigt wird , sodass viele Textkollisionen auftreten. Ich habe sowohl die Eigenschaften für Under top barsals auch Adjust scroll view insetsdie Eigenschaften angepasst, die das Scrollen unter verhindern, jedoch auf Kosten der Beibehaltung des oberen Bereichs der Tabellenansicht. Ich habe versucht, den UITableViewFrame 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 barsund Adjust scroll viewErzwingen des Rahmens in einem neuen Bereich.

Ein Bild sagt mehr als tausend Worte: Statusleiste fließen unter

Nicholas Smith
quelle
2
Eine schnelle
Lösung
@EricS: Ich habe dort bereits einen UITableViewHeader, der auch unter der Statusleiste fließt.
Nicholas Smith
Warum nicht die Auto-Layout-Anleitung unter iOS 6 verwenden? Es klappt.
Steven Fisher

Antworten:

366

Wenn Sie dies replizieren möchten, führen Sie einfach die folgenden Schritte aus:

  1. Erstellen Sie ein neues iOS-Projekt
  2. Öffnen Sie das Haupt-Storyboard und löschen Sie die Standardeinstellung / Initiale UIViewController
  3. Ziehen Sie eine neue UITableViewControlleraus der Objektbibliothek
  4. Legen Sie es als Erstansichts-Controller fest
  5. Geben Sie der Tabelle einige Testdaten

Wenn 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:

// These do not work
self.edgesForExtendedLayout=UIRectEdgeNone;
self.extendedLayoutIncludesOpaqueBars=NO;
self.automaticallyAdjustsScrollViewInsets=NO;

Dieses Problem kann sehr frustrierend sein, und ich glaube, es ist ein Fehler von Apple, insbesondere weil es in der eigenen vorverdrahteten UITableViewControllerObjektbibliothek 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 UITableViewControllerim Storyboard, ohne es in einer anderen Ansicht manuell zu platzieren, können Sie das einbetten UITableViewControllerin einem UINavigationController(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 Ihre UITableViewControllerSzene im Storyboard.

  • Verwenden von AutoLayout und Einbetten von UITableViewin eine andere Ansicht (ich glaube, Apple möchte, dass wir dies tun) :
    Erstellen Sie ein leeres UIViewControllerund ziehen Sie UITableViewes hinein. Ziehen Sie dann bei gedrückter Strg-Taste von Ihrer UITableViewin 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.

marinosb
quelle
5
Zu Ihrer Information, Option 1 (Einbettung in einen Navigationscontroller) führt dazu, dass die Zellen hinter der durchscheinenden Statusleiste sichtbar sind, wenn Sie durch die Tabelle scrollen.
RyanR
4
@ RyanR Das habe ich auch bemerkt, aber ich denke, es ist irgendwann in Ordnung. Apple hat dasselbe in der geöffneten Registerkartenansicht von Mobile Safari getan. Registerkarten werden unter der Statusleiste angezeigt. Die Navigationscontroller-Lösung ist die einfachste Problemumgehung. Die durchscheinende Statusleiste ist jedoch eine blöde Idee.
Pride Chung
6
Wenn ich die Steuerung von der Tabellenansicht nach oben ziehe, stoße ich nie auf die Statusleiste. Es gibt keine sichtbare Statusleiste in der Ansicht, nicht sicher, was Sie hier meinen ...
Jesse
4
Option 2 funktioniert in Xcode 5 nicht mehr . Die beschriebene Aktion (Strg-Ziehen) sollte niemals funktionieren, da sie dem Outlets-System gehört. Selbst wenn Sie manuell in den Szenenbaum links ziehen, funktioniert die obere Layout-Anleitung NICHT (sollte es tun, AFAICT - Ich glaube, dies ist ein weiterer großer Fehler in AutoLayout :( :()
Adam
3
@PrideChung es sieht dumm aus, wenn man einen Header mit der Tabellenansicht verwendet, der Header bleibt oben fixiert und die Elemente verschwinden hinter - und erscheinen wieder hinter der transparenten Statusleiste ...
Ixx
86

Wenn Sie programmgesteuert arbeiten und a UITableViewControllerohne verwenden, UINavigationControllerist es am besten, wenn Sie Folgendes tun viewDidLoad:

Swift 3

self.tableView.contentInset = UIEdgeInsets(top: 20, left: 0, bottom: 0, right: 0)

Früher Swift

self.tableView.contentInset = UIEdgeInsetsMake(20.0f, 0.0f, 0.0f, 0.0f);

Der UITableViewControllerBildlauf wird weiterhin hinter der Statusleiste angezeigt, befindet sich jedoch nicht darunter, wenn Sie nach oben scrollen.

Lipka
quelle
1
Sie können eine Überprüfung für Betriebssystemversion> 7 hinzufügen und auch ältere Betriebssysteme unterstützen (kein Einschub für diese). Ansonsten hat das für meine Zwecke gut funktioniert.
SimpsOff
8
Der Hardcoding-Höhenwert ist nicht die beste Idee.
Maciej Kozieł
3
Ja, verwenden Sie topLayoutGuidestattdessen die Länge.
Lipka
10
Ich würde UIApplication.sharedApplication.statusBarFrame.size.heightanstelle von 20 verwenden.
Mojuba
Das wurde heutzutage auf UIApplication.shared.statusBarFrame.size.height aktualisiert.
Asetniop
23

Bitte beachten Sie: Dies funktionierte bei mir für die folgende Konfiguration:

  • Keine Navigationsleiste am oberen Bildschirmrand (Tabellenansicht entspricht Statusleiste)
  • Die Tabellenansicht kann nicht gescrollt werden

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:

- (void) viewDidLayoutSubviews {
    // only works for iOS 7+
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
        CGRect viewBounds = self.view.bounds;
        CGFloat topBarOffset = self.topLayoutGuide.length;

        // snaps the view under the status bar (iOS 6 style)
        viewBounds.origin.y = topBarOffset * -1;

        // shrink the bounds of your view to compensate for the offset
        viewBounds.size.height = viewBounds.size.height + (topBarOffset * -1);
        self.view.bounds = viewBounds;
    }
}

Quelle (im Abschnitt topLayoutGuide unten auf Seite 39).

Stunner
quelle
Interessant ... Ich konnte es in meinem Projekt problemlos so nennen ... Ich habe möglicherweise eine einfachere Struktur des Ansichtslayouts als Sie. Ihr Vorschlag ist richtig, ich werde diese Änderung in meiner Antwort vornehmen.
Stunner
Ich bin zufällig auf das Problem gestoßen, als ich meine App gedreht habe. Wenn Sie die Rotation deaktiviert hätten, hätten Sie wahrscheinlich kein Problem.
Jeremy
Ich habe in meinem Projekt keine Rotation aktiviert und bin auf das Problem gestoßen, aber ja, immer noch ein guter Punkt.
Stunner
1
Für jeden, der seinen eigenen Container-Controller implementiert, ist dies die richtige Methode, um den Status oder die Überlappung der Navigationsleiste anzupassen!
Rafael Nobre
Wenn Sie den Ursprung ändern, aber nicht die Höhe der Ansichtsgrenzen, wird der untere Rand am unteren Bildschirmrand nicht um den Betrag abgeschnitten, um den Sie den Ursprung geändert haben? (so wird es unmöglich, die letzten paar Zeilen von Pixeln zu sehen)
Tenfour04
20

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


  1. Ziehen Sie einen leeren ViewController auf das Storyboard. Controller anzeigen

  2. Ziehen Sie ein UITableView- Objekt in die Ansicht. (Nicht UITableViewController). Positionieren Sie es mit den blauen Layout-Hilfslinien genau in der Mitte.

Tabellenansicht Bild zentrieren

  1. Ziehen Sie eine UITableViewCell in die TableView. Dies ist Ihre Prototyp-Wiederverwendungszelle. Vergessen Sie also nicht, die Wiederverwendungskennung auf der Registerkarte Attribute festzulegen, da sonst ein Absturz auftritt.

Tabellenansichtszelle hinzufügen Kennung wiederverwenden

  1. 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.

  2. Erstellen Sie eine Steckdose für Ihre TableView in Ihrer Implementierungsdatei und nennen Sie sie "tableView".

Outlet erstellen Tabellenansicht

  1. Klicken Sie mit der rechten Maustaste auf die Tabellenansicht und ziehen Sie sowohl die dataSource als auch den Delegaten auf Ihren ViewController.

dataSource-Delegat

Nun zum Teil, nicht in die Statusleiste zu schneiden.

  1. Nehmen Sie die Oberkante Ihrer Tabellenansicht und verschieben Sie sie nach unten in eine der gestrichelten blauen Auto-Layout-Hilfslinien, die sich oben befinden

Größe ändern

  1. Jetzt können Sie das Ziehen von der Tabellenansicht nach oben steuern und die Option Top Space to Top Layout Guide auswählen

Top Space to Top Layout-Anleitung

  1. Es wird Ihnen ein Fehler bezüglich des mehrdeutigen Layouts von TableView angezeigt. Fügen Sie einfach fehlende Einschränkungen hinzu und fertig.

Fehlende Einschränkungen hinzufügen

Jetzt können Sie Ihre Tabellenansicht wie gewohnt einrichten und die Statusleiste wird nicht abgeschnitten!

ErikAGriffin
quelle
11
- (void) viewDidLayoutSubviews {
    if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) {
        self.navigationController.navigationBar.barStyle = UIBarStyleBlackOpaque;
        if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
            self.edgesForExtendedLayout = UIRectEdgeNone;   // iOS 7 specific
        CGRect viewBounds = self.view.bounds;
        CGFloat topBarOffset = self.topLayoutGuide.length;
        viewBounds.origin.y = topBarOffset * -1;
        self.view.bounds = viewBounds;
        self.navigationController.navigationBar.translucent = NO;
    }
}

https://developer.apple.com/library/ios/documentation/userexperience/conceptual/TransitionGuide/SupportingEarlieriOS.html#//apple_ref/doc/uid/TP40013174-CH14-SW1

Olzh
quelle
2
Schalten Sie <= auf> und entfernen Sie den leeren if-Block
pfrank
1
Durch das Lesen self.topLayoutGuide.lengthvon viewDidLayoutSubviewswird das Layout der untergeordneten Ansichten durcheinander gebracht.
@OLzh Während Sie dies tun, kann self.tableView nicht scrollen.
DawnSong
8

Wählen Sie UIViewController in Ihrem Storyboard aus und deaktivieren Sie die Option Kanten unter oberen Balken erweitern. Hat für mich gearbeitet. :)

Pegpeg
quelle
Leider hat es bei mir nicht funktioniert. Der vollständig standardmäßige UITableViewController überlappt weiterhin die Statusleiste. Ich denke nicht, dass die Statusleiste als Top-Leiste zählt. Nur Navigationsleisten und Registerkartenleisten.
Andrew Duncan
Die einzige Lösung, die für mich funktioniert, ty. (Beachten Sie, dass Sie die Tabellenansicht unter der Statusleiste in IB "kürzen" und Einschränkungen aktualisieren müssen.)
Martin Makarsky
Arbeitete für mich an Xcode 8 mit einem UITableViewController.
Edouard Barbier
8

So schreibt man es in "Swift" Eine Anpassung an @ lipkas Antwort:

tableView.contentInset = UIEdgeInsetsMake(20.0, 0.0, 0.0, 0.0)
uplearnedu.com
quelle
Ist hier nicht schnell erlaubt?
uplearnedu.com
Einzige Lösung, die für mich funktioniert hat, die mich nicht dazu bringt, einen UIVIewController zu erstellen
Shereef Marzouk
1
Dies ist weniger als ideal, da der obere Einschub bei 20 bleibt, selbst in Landschaften, in denen es keine Standardstatusleiste in ios8 gibt
voidref
Diese Variante handhabt jede Konfiguration gut für mich:- (void)viewDidLayoutSubviews { if (self.tableView.contentInset.top != self.topLayoutGuide.length) { self.tableView.contentInset = UIEdgeInsetsMake(self.topLayoutGuide.length, 0.0, 0.0, 0.0); } }
qix
5

Bei Xcode 7 hat es für mich funktioniert, das Häkchen für die Navigationsleiste zu deaktivieren.

Geben Sie hier die Bildbeschreibung ein

David T.
quelle
Einfachste, schnellste, einfachste, sicherste? Lösung. Ich weiß nicht, warum dies im Vergleich zu allem anderen so wenige positive Stimmen hat.
Gruntcakes
3

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.

class MyTableViewController: UITableViewController {

    override func viewDidLoad() {
        super.viewDidLoad()    
        configureTableViewTop()
    }

    override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
        super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)
        coordinator.animateAlongsideTransition({ (context) -> Void in
            }, completion: { (context) -> Void in
                self.configureTableViewTop()
        })
    }

    func configureTableViewTop() { 
        tableView.contentInset.top = UIApplication.sharedApplication().statusBarFrame.height
    }
}
Harris
quelle
2

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:

- (void)viewDidLoad {
    [super viewDidLoad];

    // Shove everything down if iOS 7 or later
    float systemVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
    if (systemVersion >= 7.0f) {

        // Move the view down 20 pixels
        CGRect bounds = self.view.bounds;
        bounds.origin.y -= 20.0;
        [self.view setBounds:bounds];

        // Create a solid color background for the status bar
        CGRect statusFrame = CGRectMake(0.0, -20.0, bounds.size.width, 20);
        UIView* statusBar = [[UIView alloc] initWithFrame:statusFrame];
        statusBar.backgroundColor = [UIColor redColor];
        [self.view addSubview:statusBar];
    }

Ersetzen redColorSie 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 = NOund Status bar style = Opaque black stylein der Liste, um dies global zu tun.

Scheint zu funktionieren, und ich wäre interessiert, von Fehlern oder Problemen damit zu hören.

Hot Licks
quelle
2

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:

UIViewController *containerLeftViewController = [[UIViewController alloc] init];
UITableViewController *tableViewController = [[UITableViewController alloc] init];

containerLeftViewController.view.backgroundColor = [UIColor redColor];

hostsAndMoreTableViewController.view.translatesAutoresizingMaskIntoConstraints = NO;
[containerLeftViewController.view addSubview:tableViewController.view];

[containerLeftViewController addChildViewController:tableViewController];
[tableViewController didMoveToParentViewController:containerLeftViewController];

NSDictionary * viewsDict = @{ @"tableView": tableViewController.view ,
                              @"topGuide": containerLeftViewController.topLayoutGuide,
                              @"bottomGuide": containerLeftViewController.bottomLayoutGuide,
                              };
[containerLeftViewController.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[tableView]|"
                                                                                         options:0
                                                                                         metrics:nil
                                                                                           views:viewsDict]];
[containerLeftViewController.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[topGuide][tableView][bottomGuide]"
                                                                                         options:0
                                                                                         metrics:nil
                                                                                           views:viewsDict]];

Prost, Ben

bhr
quelle
1

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.

Phong Le
quelle
1

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:

    self.CoverView = [[UIView alloc]init];

    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {

    self.CoverView.frame = CGRectMake(0,0,self.view.bounds.size.width,20);
    }

    self.CoverView.backgroundColor = [UIColor whiteColor];
    self.TableView = [[UITableView alloc]initWithFrame:CGRectMake(0,
    self.CoverView.bounds.size.height,XXX, YYY)];
    [self.view addSubview:self.TableView];
    [self.view addSubview:self.CoverView];

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

lilislilit
quelle
1

Ich habe dies für Retina / Non-Retina-Anzeige als getan

BOOL isRetina = FALSE;

if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) {
    if ([[UIScreen mainScreen] scale] == 2.0) {
        isRetina = TRUE;
    } else {
        isRetina = FALSE;
    }
}

if (isRetina) {
    self.edgesForExtendedLayout=UIRectEdgeNone;
    self.extendedLayoutIncludesOpaqueBars=NO;
    self.automaticallyAdjustsScrollViewInsets=NO;
}
MaxEcho
quelle
1

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:

- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection {
    [super traitCollectionDidChange:previousTraitCollection];
    // Fix up content offset to ensure the tableview isn't underlapping the status bar.
    self.tableView.contentInset = UIEdgeInsetsMake(self.topLayoutGuide.length, 0.0, 0.0, 0.0);
}
qix
quelle
1

Funktioniert für schnelle 3 - In viewDidLoad ();

let statusBarHeight = UIApplication.shared.statusBarFrame.height

let insets = UIEdgeInsets(top: statusBarHeight, left: 0, bottom: 0, right: 0)
tableView.contentInset = insets
tableView.scrollIndicatorInsets = insets

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.

Wesh RaphLola
quelle
1

Für diejenigen wie mich, die ihre lieber nicht UITableViewControllerin einen UIViewControllerVersuch einbetten möchten :

Eine benutzerdefinierte UITableViewControllerUnterklasse 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.

private var statusBarMaskView: UIView!

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    if let superview = self.tableView.superview {
        self.statusBarMaskView = UIView(frame: CGRect.zero)
        superview.insertSubview(self.statusBarMaskView, aboveSubview: self.tableView)
        self.statusBarMaskView.backgroundColor = self.tableView.backgroundColor

        // using a nice constraint layout library to set the frame
        self.statusBarMaskView.pinTop(to: superview)
        self.statusBarMaskView.pinLeft(to: superview)
        self.statusBarMaskView.pinRight(to: superview)
        self.statusBarMaskView.addHeightConstraint(with: 22.0)
        ////
    }
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)

    self.statusBarMaskView.removeFromSuperview()
    self.statusBarMaskView = nil
}
Lee Irvine
quelle
0

Ich hatte eine UISearchBar oben in meiner UITableView und die folgenden funktionierten;

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

Teile und genieße...

Sam T.
quelle
0

Ich habe es geschafft, indem ich die Größe auf Freiform eingestellt habe

Geben Sie hier die Bildbeschreibung ein

fengd
quelle
2
Die "Simulierten Metriken" gelten nur für die Anzeige Ihrer Kreation in Xcode, nicht für die Realität. [Siehe: stackoverflow.com/questions/16279379/…
Tyler A.
0

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.

Jack Bellis
quelle
0

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:

float systemVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
if (systemVersion >= 7.0f) {

    // Move the view down 20 pixels
    CGRect bounds = self.view.bounds;
    bounds.origin.y -= 20.0;
    [self.navigationController.view setBounds:bounds];

    // Create a solid color background for the status bar
    CGRect statusFrame = CGRectMake(0.0, -20.0, bounds.size.width, 20);
    UIView* statusBar = [[UIView alloc] initWithFrame:statusFrame];
    statusBar.backgroundColor = [UIColor whiteColor];
    [statusBar setAlpha:1.0f];
    [statusBar setOpaque:YES];
    [self.navigationController.view addSubview:statusBar];
}

Es ähnelt der Lösung von Hot Licks, wendet jedoch die Unteransicht auf den Navigationscontroller an.

sfr14
quelle
Dies ist die einzige Antwort, die in iOS 8 für mich funktioniert hat!
SamB
0
override func viewDidLoad() {
 // your code

 if let nc = self.navigationController {
   yourView.frame.origin.y = nc.navigationBar.frame.origin.y + nc.navigationBar.frame.height
  }
}
wajih
quelle
0

Hier ist ein Swift 2.3. (Xcode 8.0) Lösung. Ich habe eine Unterklasse von UITableView erstellt.

class MYCustomTableView: UITableView
{   
    override func drawRect(rect: CGRect) {
        super.drawRect(rect)
        contentInset    = UIEdgeInsetsZero
    }
}

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).

Darkwonder
quelle
0

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.

Geben Sie hier die Bildbeschreibung ein

Draufgänger
quelle
0

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.

Geben Sie hier die Bildbeschreibung ein

NSCoder
quelle
-1

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.

- (void) viewDidLayoutSubviews {
float systemVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
if (systemVersion >= 7.0f) {
    CGRect bounds = self.view.bounds;
    if(self.navigationController == nil || self.navigationController.isNavigationBarHidden == YES){
        bounds.origin.y -= 20.0;
        [self.view setBounds:bounds];
    }
    else{
        self.edgesForExtendedLayout = UIRectEdgeNone;
    }
}

hilf das funktioniert.

phnix
quelle
-2

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 frameManipulation 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 .

Scott Berrevoets
quelle
Das Abstellen des Rahmens ändert dies leider nicht.
Nicholas Smith
Was funktioniert daran nicht? Die Tabellenansicht bewegt sich nicht nach unten?
Scott Berrevoets
Ja, es bleibt in der gleichen Position. Ich habe es versucht self.view.frameund self.tableView.framein beiden viewWillAppearund viewDidLoad. Um sicher zu gehen, habe ich auch setContentNeedsDisplayein Neuzeichnen erzwungen.
Nicholas Smith
Ist das automatische Layout aktiviert?
Scott Berrevoets
Ja, es ist Autolayout und Storyboard.
Nicholas Smith