UITableView beginnt mit einem Offset in iOS 7


115

Ich habe eine einfache Jane UITableView auf einen UIViewController in iOS 7 gezogen.

Jetzt gibt es einen vertikalen Raumversatz, bevor die erste Zelle startet. Wie werde ich es los? Ich möchte, dass die erste Zeile viel näher an der Oberkante des tatsächlichen Starts von UITableView liegt. Ich habe nicht nach dem großen Versatz gefragt, oder?

Geben Sie hier die Bildbeschreibung ein

Irgendwelche Ideen?


43
Folgendes hat mir geholfen: YouStoryboard.storyboard> YouViewController> Attributinspektor> Deaktivieren - Bildlaufansichten anpassen.
Alexander

17
Übrigens können Sie Screenshot von iOS Simulator mit Befehlstaste + S
Hemang

@Alexander: Mir wurde auch bei Ihren Vorschlägen geholfen. Durch Deaktivieren der Option ExtendEdges.UnderTopBars wurde jedoch erneut der vertikale Versatzbereich angezeigt. Ich bin mir nicht sicher, ob es einer der (vielen?) Fehler in Xcode6 ist, aber diese Probleme bereiten mir hin und wieder Kopfschmerzen!
iOS-Coder

Antworten:


81

Standardmäßig füllen Controller für Tabellenansichten den Inhalt unter der Navigationsleiste auf, sodass Sie den Inhalt darunter scrollen und ihn in einem unscharfen Zustand unter der Navigationsleiste / Symbolleiste anzeigen können.

Sieht so aus, als würden Sie es auf 44 (vielleicht 64) px positionieren, um es unter der Navigationsleiste herauszuholen, aber es gleicht dies bereits aus, sodass Sie eine große Lücke erhalten.

Gehen Sie in IB zum Storyboard / xib und deaktivieren Sie den Inhalt der Show unter Nav-Bar.


6
Entschuldigung, wie ist der Kommentar zu NDA unter iOS7 irrelevant? Dies ist ein Forum, um Menschen zu helfen.
Cocoadelica

In Xcode Version 5.1 auf Viewcontroller deaktivieren Sie erweiterte Kanten> Unter den oberen Balken, um den oberen UITableView-Inhaltseinsatz zu entfernen
Emel Elias

3
Also, wo ist Showinhalt unter Nav Bar Thigo? Ich kann es nicht finden.
Anup Kattel

10
@FrankGorman In Xcode 5.1.1 gibt es eine Option im Storyboard für einen bestimmten View Controller Adjust Scroll View insets. Entfernen Sie das Häkchen.
Korat Prashant

1
hey @koratprashant. sehr nützlicher Kommentar.
KDeogharkar

107

Die neue iOS 7- Implementierung von UIViewController verfügt über eine Reihe neuer Optionen, mit denen der Entwickler auswählen kann, ob das System automatisch Einfügungen für UIScrollView , UITableView und Ableitungen hinzufügt .

Um dieses Verhalten zu deaktivieren, deaktivieren Sie diese Kontrollkästchen für alle gewünschten UIViewController in InterfaceBuilder im ausgewählten Objektinspektor von UIViewController :

Controller Inspector anzeigen

Für mehr Details:

  1. Senden Sie Ihre iOS 7-Apps noch heute.
  2. iOS 7 UI Transition Guide> Aussehen und Verhalten

Vielen Dank! Du hast mich gerettet.
rsc

68

Aus der iOS7-Übergangsanleitung:

Wenn Sie nicht möchten, dass die Inhaltseinfügungen einer Bildlaufansicht automatisch angepasst werden, setzen Sie automatischAdjustsScrollViewInsets auf NO. (Der Standardwert von autoAdjustsScrollViewInsets ist YES.)

   self.automaticallyAdjustsScrollViewInsets = NO;

9
Dies kann auch in XCode im Attributinspektor festgelegt werden. Deaktivieren Sie das Adjust Scroll View InsetsKontrollkästchen für das Layout des Ansichtscontrollers.
Andrew

1
Wenn Sie den UIViewController programmgesteuert laden (ohne XIB zu verwenden), funktioniert dieser wie ein Zauber. In automaticallyAdjustsScrollViewInsets = NOder Ansichtssteuerung einstellen.
KabraBoja

Das war es für mich. Verwirrend, weil sich meine TableView in einer Containeransicht befand und anfangs gut aussah. Aber es wurde vermasselt, als ich von einem anderen View Controller zurückkam.
n13

Toll! Sparen Sie mir viel Zeit!
Inix

34

Ich hatte ein ähnliches Problem, nachdem ich einen viewController geschlossen hatte, wurde das contentOffset aus meiner tableView in (0, -64) geändert.

Meine Lösung war etwas seltsam. Ich habe alle anderen Antworten ausprobiert, aber keinen Erfolg gehabt. Das einzige, was mein Problem behoben hat, war das Ändern der tableView-Position im Steuerelementbaum der .xib

Es war das erste Steuerelement in der übergeordneten Ansicht wie folgt:

Vor

Ich habe die tableView direkt nach der ImageView verschoben und es hat funktioniert:

nach dem

Es scheint, dass das Versetzen der Tabellenansicht in die erste Position das Problem verursacht hat und das Verschieben der Tabellenansicht in eine andere Position das Problem behoben hat.

PD Ich verwende weder autoLayout noch Storyboards

hoffe das kann jemandem helfen!


Mir ist das Gleiche aufgefallen! Ich füge keine zusätzlichen Ansichten hinzu, sondern kompensiere einfach die Lücke, die das UITableView -44 nach oben bewegt. In IB muss ich anscheinend -64px verschieben, aber in der Laufzeit -64px wird die Navigationsleiste durch Tablview überlagert und -44px ist in Ordnung. Ich kann es nicht ganz erklären. Ich habe dieses Problem in der iPad-Popover-Ansicht gefunden, als ich im iPhone-Storyboard kein ähnliches Problem festgestellt habe.
Mike Keskinov

Dieses Problem tritt auch bei der uiview auf. wenn die in der Benutzeroberfläche angezeigte Ansicht nicht in derselben Reihenfolge angeordnet ist.
Rinku

2
Ich hatte heute das gleiche Problem mit XCode 6.1. Kreide noch 2-3 Stunden verschwendet und versuche, Apples Fehler
Mike Gledhill

3
Dies war äußerst hilfreich und verdient mehr Aufmerksamkeit! Es hat mir nicht geholfen, mit den Einstellungen des Ansichts-Controllers oder dem Einfügen / Versetzen von Inhalten herumzuspielen, aber das Ändern der Reihenfolge der Ansichten im Storyboard hat das Problem für mich gelöst.
Caleb

1
Apple, ich meine ... WTF? Danke Mann, dieses Storyboard wurde auch mit Autolayout repariert.
Borzh

30

es löst mein ähnliches Problem:

if ([[UIDevice currentDevice].systemVersion floatValue] >= 7){
tableView.contentInset = UIEdgeInsetsMake(-20, 0, 0, 0);
}

1
Sie sollten die Systemversion folgendermaßen überprüfen:if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1)
rckoenes

Dies funktionierte für mich bei dem Abstandsproblem, das ich hatte, aber jetzt wird mein Pull-to-Refresh-Kontrollspinner teilweise verdeckt und unter meinem Hauptmenü angezeigt. Hat das auch jemand gesehen? Problemumgehungen?
Nick

@ Nickv2002 versuchen, tableView programmgesteuert zu erstellen
Alex

Ich habe alle anderen Lösungen ausprobiert, aber nur diese hat für mich
funktioniert

13

Versuchen Sie dies zu verwenden

tableView.separatorInset = UIEdgeInsetsZero;

Wenn Sie weniger als iOS7 unterstützen, müssen Sie natürlich sicherstellen, dass das Objekt auf diesen Selektor reagiert, bevor Sie es aufrufen.


4
Ich bin mir nicht sicher, warum dies abgelehnt wird ... separatorInset ändert nur die Abstandslinien zwischen Zellen, die vom Rand der Ansicht eingefügt werden. Die Frage ist nach dem Raum über und unter den Zellen
Rembrandt Q. Einstein

Das Bild ist irreführend, aber eine häufige Google-Suche nach dem Randproblem ergibt diese Seite.
Will

9

Im Ernst, Veränderung contentOffsetist nicht die Lösung. Sie beheben nur ein Problem und beheben die Ursache nicht. Ich hatte das gleiche Problem und es stellte sich heraus, dass gruppierte tableViews oben eine Auffüllung haben. In meinem Fall setzen Sie den Typ auf normal hat den Trick getan.

Hoffentlich spart es jemandem ein paar Minuten. Z.


1
Ich habe es total verpasst, froh, dass ich deine Antwort gefunden habe, UPVOTE
AamirR

8

Unter iOS 9 funktionierte keine der anderen Antworten auf dieser Seite für mich (dh Deaktivieren der Kontrollkästchen im Storyboard automaticallyAdjustsScrollViewInsetsauf)NO ).

Meine Problemumgehung, über die ich wirklich unzufrieden bin, war folgende:

- (void)viewDidAppear:(BOOL)animated {
    self.tableView.contentOffset = CGPointMake(0.0, 0.0);
    self.tableView.contentInset = UIEdgeInsetsMake(0.0, 0.0, 0.0, 0.0);
}

Die gleichen Zeilen in viewWillAppearoder viewDidLoadwaren unwirksam.


Dies sollte die einzige Antwort für uitableviewcontroller iOS 9 sein ... wirklich, nichts anderes hat geholfen, und ich habe sie alle ausprobiert, wo haben Sie das gefunden oder wie haben Sie es herausgefunden? viele 10x
Erez

Das Deaktivieren des Adjust Scroll View insetsKontrollkästchens funktioniert für iOS 9.
Adam

Scroll View Insets anpassen funktioniert bei mir keine andere Lösung?
Yogesh Patel

5

Manchmal wird 64oben in meiner Tabellenansicht UIViewControllereine Höhenlücke angezeigt, wenn die in einen Navigationscontroller eingebettet ist.

Geben Sie hier die Bildbeschreibung ein

In der Vergangenheit habe ich einfach alles neu erstellt, in der Hoffnung, dass sich die Einschränkungen nach einer sauberen Tafel als richtig herausstellen.

TIL: Wenn Sie keine vertikale Einschränkung für das festlegen möchten Top Layout Guide, können Sie die OptionTaste gedrückt halten, um auf das zuzugreifen Container Margin.

Geben Sie hier die Bildbeschreibung ein

Stellen Sie dann sicher, dass die Top Space to SuperviewKonstante auf eingestellt ist 0. Das hat zumindest bei mir funktioniert.

Geben Sie hier die Bildbeschreibung ein


1,5 Jahre später, aber das löste meinen Abend. Vielen Dank!
asp_net

4

Das funktioniert bei mir:

- (void)loadView
{
    [super loadView];

    [self setAutomaticallyAdjustsScrollViewInsets:YES];

    self.edgesForExtendedLayout = UIRectEdgeNone;
    self.view.frame = CGRectZero;
    self.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
}

2

Wenn Sie vor UITableView eine leere UIView hinzufügen (oder eine Ansicht wie ScrollView und TextView scrollbar ist), können Sie Glück haben.


1

Ich hatte einen UITableViewController in eine Containeransicht eingebettet. Um die unerwünschten 64 Punkte des vertikalen Raums zu beseitigen, musste ich im Interface Builder die Option "Bildlaufansichten anpassen" deaktivieren und das contentInset von UITableView in viewWillAppear meines UITableViewControllers wie folgt festlegen.

Die Größe des vertikalen Raums scheint mit der Rahmenhöhe und dem y-Versatz der Navigationsleiste übereinzustimmen. Das Problem trat nur unter iOS 7 auf.

- (void)viewWillAppear:(BOOL)animated;
{
    [super viewWillAppear:animated];

    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
        const CGRect navBarFrame = self.navigationController.navigationBar.frame;
        const CGFloat blankVerticalSpace = navBarFrame.origin.y + navBarFrame.size.height;
        self.tableView.contentInset = UIEdgeInsetsMake(-blankVerticalSpace, 0, 0, 0);
    }
}

1

In Xamarin iOS trat dieses Problem auf einem UITableViewController im Hintergrund auf, kurz nachdem der modale Vordergrunddialog geschlossen wurde. Während der UITableViewController in den Vordergrund rückte, wurden Insets gesetzt (irgendwo von iOS):

Diese Klasse hat es gelöst

public class UITableViewControllerWithBugFix : UITableViewController {
    public UITableViewControllerWithBugFix(UITableViewStyle withStyle) : base(withStyle) {
    }

    public override void ViewWillLayoutSubviews() {
        if (TableView.ContentInset.Top != 0.0f)
            TableView.ContentInset = UIEdgeInsets.Zero;
        if (TableView.ScrollIndicatorInsets.Top != 0.0f)
            TableView.ScrollIndicatorInsets = UIEdgeInsets.Zero;

        base.ViewWillLayoutSubviews();
    }
}

1

Von Zeit zu Zeit kehre ich zu dieser schrecklichen Situation zurück und bemerke, dass sie noch ziemlich unbekannt ist. Also, für die zukünftige Erinnerung ...

In letzter Zeit behebe ich mich mit dieser Problemumgehung.

  1. Fügen Sie oben in UITableView eine Unteransicht mit einer Pixelhöhe von Null hinzu. Funktioniert mit oder ohne Autolayout.
  2. Wenn ich mir sicher bin :-) Ich entferne diese gefälschte Ansicht, behebe die Einschränkungen oben und es funktioniert auf magische Weise.

Fragen Sie mich nicht warum, ich denke immer noch, dass es ein Fehler tief in UIKit ist.


0

Wenn Sie zum Storyboard wechseln, können Sie den Versatz ändern, indem Sie die Tabelle auswählen. Im Abschnitt "Tabellenansicht" im Inspektor "Attribute" ändern Sie einfach die Trennzeicheneinfügungen links in "0".


0

Ich denke, die wirkliche Lösung besteht darin, Ihre oberen und unteren Einschränkungen für die Tabellenansicht so einzurichten, dass sie mit topMargin und bottomMargin übereinstimmen. Nicht die obere Layoutanleitung und die untere Layoutanleitung. Auf diese Weise können Sie automatischAnjustsScrollViewInsets auf true setzen.


0

Swift 3-Lösung:

class PaddingLessTableView : UITableView
{
    override func headerView(forSection section: Int) -> UITableViewHeaderFooterView?
    {
        return nil
    }

    override func footerView(forSection section: Int) -> UITableViewHeaderFooterView?
    {
        return nil
    }
}

0

Wenn Sie Ihren TableViewController in einen NavigationController oder eine ContainerView eingebettet haben , You have to constraint to margins instead of top Layout guide in Storyboard. Check constraint to margins when you are doing the constraintsFür mich hat kein anderer Weg funktioniert. Ich konnte keinen Kommentar abgeben, also wiederhole ich nur die Antwort von Robert Chens.


0

Ich habe einige der Antworten ausprobiert. Das Ändern der Einstellungen im Storyboard verursachte Welligkeitsprobleme mit einem Overlay-Menü, das von links angezeigt wird.

Ich habe nur einen leeren UIViewController im Storyboard, sonst wird alles programmgesteuert generiert.

Ich habe das gleiche Problem mit einer UITableView in einer UIView in einem UIViewController. Die Abschnittsüberschriften beginnen nämlich zu weit unten, wenn der UIViewController in einen Navigationscontroller eingebettet ist. Ohne den Navigationscontroller funktioniert alles einwandfrei.

Um das Problem zu beheben, habe ich ein UILabel erstellt und mit Einschränkungen die untere UILabel-Einschränkung = die obere Einschränkung der UIView platziert (damit sie nicht auf dem Bildschirm angezeigt wird. Mit diesem zusätzlichen Steuerelement (dem neuen Label) verhält sich die TableView nun ordnungsgemäß.

    inputsContainerView.addSubview(titleLabel)
    inputsContainerView.addSubview(tableView)

    // inputsContainerView
    ///////////////////////////////////////
    inputsContainerView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
    inputsContainerView.centerYAnchor.constraint(equalTo: view.centerYAnchor, constant: 0).isActive = true
    inputsContainerView.widthAnchor.constraint(equalTo: view.widthAnchor, constant: -40).isActive = true
    inputsContainerView.heightAnchor.constraint(equalTo: view.heightAnchor, multiplier: 0.7).isActive = true

    // tableView
    ///////////////////////////////////////
    tableView.centerXAnchor.constraint(equalTo: inputsContainerView.centerXAnchor).isActive = true
    tableView.topAnchor.constraint(equalTo: inputsContainerView.topAnchor).isActive = true
    tableView.widthAnchor.constraint(equalTo: inputsContainerView.widthAnchor).isActive = true
    tableView.heightAnchor.constraint(equalTo: inputsContainerView.heightAnchor).isActive = true

    // titleLabel - inserted to stop bad section header behavior
    ///////////////////////////////////////
    titleLabel.centerXAnchor.constraint(equalTo: inputsContainerView.centerXAnchor).isActive = true
    titleLabel.bottomAnchor.constraint(equalTo: inputsContainerView.topAnchor).isActive = true
    titleLabel.widthAnchor.constraint(equalTo: inputsContainerView.widthAnchor).isActive = true
    titleLabel.heightAnchor.constraint(equalToConstant: 20).isActive = true

0

Ich hatte das gleiche Problem in iOS 11 und xib, UITableviewController, und habe es wie folgt gelöst

[self.tableView setContentInset:UIEdgeInsetsMake(-44,0,0,0)];
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.