Warum gibt es oben in meinem UITableView eine zusätzliche Auffüllung mit dem Stil UITableViewStyleGrouped in iOS7?

635

Ab iOS7 gibt es oben auf meinen zusätzlichen Speicherplatz, der UITableVieweinen Stil hat UITableViewStyleGrouped.

Hier ist ein Beispiel:

Geben Sie hier die Bildbeschreibung ein

Die Tabellenansicht beginnt beim ersten Pfeil, es gibt 35 Pixel unerklärlichen Abstand, dann wird der grüne Header UIViewvon zurückgegeben viewForHeaderInSection(wobei der Abschnitt 0 ist).

Kann jemand erklären, woher diese 35-Pixel-Menge kommt und wie ich sie loswerden kann, ohne zu wechseln UITableViewStylePlain?


Hinweis:

In iOS 11 und höher:

tableView.contentInsetAdjustmentBehavior = .never
Silber
quelle
Verwenden Sie das neueste iOS 7? Einige dieser Arten von Inkonsistenzen (aber nicht alle und vielleicht auch nicht diese) wurden in den späteren Entwicklervorschauen behoben. Ich sollte wissen: Ich habe so viel gezögert, dass einige der Probleme verschwunden sind.
Dan Rosenstark
Überprüfen Sie die Antwort hier - stackoverflow.com/a/18986158/1463604
Nishant
Die kurze Antwort lautet, dass dieses zusätzliche Auffüllen wahrscheinlich auf die Kopfzeile der Tabellenansicht (nicht auf die Abschnittsüberschrift) zurückzuführen ist und dass UITableViewkeine Überschrift mit einer Höhe von 0,0 zugewiesen werden soll. Weitere Informationen finden Sie unter stackoverflow.com/a/31223403/1394534 .
Aurelien Porte
30
self.tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 0.0f, CGFLOAT_MIN)];Hinweis: Wird 0.0fnur ignoriert, wenn Sie es in der Höhe des Rect verwenden. Also verwenden wir den CGFloat, der der Null am nächsten kommt (zumindest hat dies für mich "funktioniert" ... einfach keine ideale Lösung).
Alejandro Iván
1
@ AlejandroIván dein Kommentar hat gerade meine Nacht gemacht. Ich habe eine Tabellenansicht mit gruppierten Prototypen. Ich verwende numberSections = data.count und setze numberRows = 1. Ich setze einen heightForFooterInSection, um einen sauberen Raum zwischen jedem zu schaffen, und aus irgendeinem Grund erschien eine leere tableHeaderView.
Ryan Alexander

Antworten:

863

Folgendes hat mir geholfen:

YouStoryboard.storyboard> YouViewController> Attributinspektor> Deaktivieren - Bildlaufansichten anpassen.

Geben Sie hier die Bildbeschreibung ein

Alexander
quelle
42
Ich denke, dies ist der richtige Weg, um diese Auffüllung zu entfernen, anstatt die edgeInset-Werte zu manipulieren.
Hgeg
21
Das hat bei mir nicht funktioniert - ich habe oben eine undurchsichtige navBar und diese deaktivierte schiebt den Inhalt darunter.
Slycrel
5
Funktioniert nicht bei Verwendung von benutzerdefinierten collectionview. (Wenn Tischansicht drinnen ist collectionviewcell)
Akshit Zaveri
5
Hat bei mir nicht funktioniert; Das einzige, was funktionierte, war der Wechsel zu Plain anstelle von Grouped
Shim
28
Ich hatte dieses Problem mit einem TableViewController in einer Containeransicht. Ich musste diese Eigenschaft nicht direkt auf dem eingebetteten TableViewController festlegen, sondern auf dem View Controller, der die Containeransicht enthielt. Dann hat es funktioniert.
Andy Mortimer
325

Ich habe ein bisschen mehr damit herumgespielt und es scheint, dass dies ein Nebeneffekt beim Einstellen der tableViews ist tableHeaderView = nil.

Da meine tableView dynamisch angezeigt wird , mache ich tableHeaderView, wenn ich Folgendes ausblenden muss tableHeaderView, anstatt Folgendes zu self.tableView.tableHeaderView = nil;tun:

self.tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, self.tableView.bounds.size.width, 0.01f)];

Ich mag diese Lösung besser als eine etwas willkürliche, contentInset.topweil ich sie auch contentInset.topdynamisch benutze . Es contentInset.topist mühsam , daran zu denken, bei jeder Neuberechnung zusätzliche 35 Pixel zu entfernen .

Herr T.
quelle
4
Tolle Lösung! In der Tat müssen Sie 0,01f festlegen, um die Standard-Header-Ansicht der Tabellenansicht wie in Ihrem Code zu entfernen.
Simone Manganelli
2
Übrigens ist dies auch mit einem Drag & Drop im Interface Builder möglich. Trotzdem danke! :)
Rudolf Adamkovič
8
Ihr Herr verdient eine Medaille dafür
Vaibhav Gautam
7
Beachten Sie, dass eine 0,01f-Höhenansicht am oberen Rand Ihrer Tabellenansicht bedeutet, dass alle Zellen unten falsch ausgerichtet sind (erste Zelle mit einem Y-Ursprung von 0,01, die nächste von cell_height + 0,01 usw.), also den Inhalt dieser Zellen wird falsch ausgerichtet sein. (Schalten Sie Debug > Color Misaligned Imagesden Simulator ein, um sich selbst davon zu überzeugen.) Das möchten Sie nicht.
Simon Whitaker
2
Es ist besser, UITableViewHeaderFooterViewanstelle von UIView zu verwenden. Und CGFLOAT_MINfunktioniert genauso, 0.01faber theoretisch besser.
Jaybo
178

Wenn Sie für IOS 7 eine Tabellenansicht in einem Ansichtscontroller zuweisen, können Sie dies untersuchen

self.edgesForExtendedLayout = UIRectEdgeNone;

Ihr Problem schien meinem ähnlich zu sein

Aktualisieren:

Swift in iOS 9.x:

self.edgesForExtendedLayout = UIRectEdge.None

Swift 3:

self.edgesForExtendedLayout = UIRectEdge.init(rawValue: 0)
yeahdixon
quelle
3
Arbeitete an meiner Ebene UITableView. Die Probleme rühren von der Tatsache her, dass ich mich UITableViewin einem UIViewControllerInneren befand, UINavigationControllerwas dazu führte, dass der Tabelleninhalt um 44 Punkte abfiel, sodass der anfängliche Inhalt nicht hinter dem lag navBar. Das wurde bei meinem Layout jedoch nicht benötigt, sodass es nur Probleme verursachte. Schließlich habe ich meinen Code geändert, automaticallyAdjustsScrollViewInsetsder auch funktioniert hat.
DBD
Diese Eigenschaft wird nur auf Ansichtscontroller angewendet, die in einen Container wie UINavigationController eingebettet sind. Der Root-View-Controller des Fensters reagiert nicht auf diese Eigenschaft. Der Standardwert dieser Eigenschaft ist all. ..Ich denke, der Standard sollte 0 sein? Wo hat das einen Vorteil.
Desh_
5
Eleganter mit Swift 3:edgesForExtendedLayout = []
Dave Batton
Hallo @yeahdixon Mit welcher Software erstellen Sie den rosa Pfeil?
Vielen
174

Versuchen Sie, die contentInsetEigenschaft zu ändern, von der UITableViewgeerbt wird UIScrollView.

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

Es ist eine Problemumgehung, aber es funktioniert

nvrtd frst
quelle
6
contentTableView.contentInset = UIEdgeInsetsMake(-20, 0, -20, 0);funktionierte am besten für mich, weil es oben und unten 20 zusätzliche Pixel gab.
Brian
1
Obwohl diese "Brute Force" -Lösung funktioniert, denke ich, dass die unteren (insbesondere die automatisch angepassten Einfügungen) höher eingestuft werden sollten.
Eladleb
134
self.automaticallyAdjustsScrollViewInsets = NO;

versuchen Sie, Sie können damit umgehen!

Guanhuiwit
quelle
Dies funktioniert hervorragend, um tableHeaderView in iOS 7.0 auszublenden, wird jedoch in älteren Versionen nicht unterstützt.
Brian
Funktioniert hervorragend unter iOS 7.
StackRunner
3
Wichtig: Stellen Sie sicher, dass Sie dies im Container-View-Controller tun. Wenn Ihre UITableView auf einem Controller platziert ist, der dann in einen anderen Controller eingebettet ist, tun Sie dies im eingebetteten Top-Controller, nicht direkt in dem, in dem Sie die UITableView ablegen (wo AutoLayout dies tut kümmere dich um die Dinge).
James Stone
Das ist besser als uncheck Adjust scroll view insets. Weil wir manchmal kein Storyboard verwenden, um unsere Benutzeroberfläche zu erstellen.
JW.ZG
Das funktioniert bei mir. Ich habe die Ansicht an die Navigationsleiste und die Tabellenansicht angehängt. Dies ist in iOS 11 nicht der Fall, aber in iOS 10. Vielen Dank.
Dobiho
78

Sie können feststellen, ob auf Ihrer App iOS7 oder höher ausgeführt wird, und diese beiden Methoden in Ihrem Tabellenansichtsdelegaten hinzufügen (normalerweise in Ihrem UIViewController-Code).

-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
    return CGFLOAT_MIN;
}

-(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
    return CGFLOAT_MIN;
}

Dies ist vielleicht keine elegante Lösung, funktioniert aber für mich

Schnelle Version:

override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return CGFloat.leastNormalMagnitude
}

override func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
    return CGFloat.leastNormalMagnitude
}
Lichtmann
quelle
1
Das hat bei mir funktioniert. UITableView fügt aus vielen verschiedenen Gründen zusätzlichen Platz hinzu. Insbesondere im Zusammenhang mit OP tritt das Problem nur bei der Tabellenansicht im gruppierten Stil auf. Und diese Lösung hat das Problem behoben.
RajV
5
Sie können CGFLOAT_MIN anstelle von 0,001 verwenden, um den kleinsten absoluten Wert von CGFloat zu erhalten.
eiKatte
2
Dies ist die richtige Antwort, da das eigentliche Merkmal darin besteht, dass das Auffüllen nur in der gruppierten Tabellenansicht vorhanden ist und ignoriert wird, wenn Sie die Kopf- / Fußzeile angeben
Jakub Truhlář
Dies sollte als die richtige Antwort markiert werden. Eine zu überschreibende Delegatmethode, die die Frage beantwortet. Versuchen Sie dies zumindest zuerst, wenn Sie alle Hacks so weit unten gelesen haben. Versuchen Sie zu twittern: - (CGFloat) tableView: (UITableView *) tableView heightForHeaderInSection: (NSInteger) section {// return CGFLOAT_MIN; return 30.0f; }
Matthew Ferguson
Nett! Als Bonus können Sie Folgendes verwenden, wenn Sie einen kleinen Header oben und mehr zwischen den gruppierten Abschnitten wünschen:override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { return section == 0 ? 14 : 24 }
Freek Sanders
55

Ich habe die Ursache meines ursprünglichen Fehlers gefunden und ein Beispielprojekt erstellt, das ihn zeigt. Ich glaube, es gibt einen iOS7-Fehler.

Wenn Sie ab iOS7 eine UITableView mit dem gruppierten Stil erstellen, aber im ersten Layout keinen Delegaten festgelegt haben, dann einen Delegaten festlegen und reloadData aufrufen, wird oben ein 35-Pixel-Speicherplatz angezeigt, der niemals verschwindet.

In diesem Projekt habe ich den Fehler vorgestellt: https://github.com/esilverberg/TableViewDelayedDelegateBug

Speziell diese Datei: https://github.com/esilverberg/TableViewDelayedDelegateBug/blob/master/TableViewDelayedDelegateBug/ViewController.m

Wenn Zeile 24 aktiv ist,

[self performSelector:@selector(updateDelegate) withObject:nil afterDelay:0.0];

Oben wird ein zusätzlicher Platz von 35 Pixel vorhanden sein. Wenn Zeile 27 aktiv und 24 auskommentiert ist,

self.tableView.delegate = self;

kein Platz oben. Es ist, als würde tableView irgendwo ein Ergebnis zwischenspeichern und sich nicht neu zeichnen, nachdem der Delegat festgelegt und reloadData aufgerufen wurde.

Silber
quelle
21
Ich würde hinzufügen, dass selbst wenn es einen Delegaten gibt, aber der Delegierte tableView:heightForHeaderInSection:und tableView:heightForFooterInSection:0 zurückgibt, Sie auch dieses Problem haben werden. Das Implementieren der obigen Protokollmethoden UND das Zurückgeben von 0,01f haben es für mich behoben.
John Estropia
1
JA!! Ich habe 3 sogenannte Lösungen ausprobiert, und dies war die eine! Genial, danke: D
Henrik Erlandsson
perfekt. Jeder hat einen Fehler gemeldet, weil ich denke, dass dies nicht das beabsichtigte Verhalten ist.
Pushparaj
toller Fund! Dies geschieht immer noch in iOS 9 (wir verwenden keine XIBs), aber das Festlegen des Delegaten auf init hat den Abstand korrigiert (nicht in loadView oder viewDIdLoad). Vielen Dank!
John Stricker
1
Das Einstellen der geschätzten Höhe für den Header hat mir geholfen
Viktor
49

Deaktivieren Sie "Bildlaufansichten anpassen".

Geben Sie hier die Bildbeschreibung ein

Tú Đt
quelle
Ich brauchte diese Option für einen anderen View Controller von mir, und anscheinend wurde die Änderung übertragen, als ich eine neue VC erstellte. Danke dafür!
David
Ja! Funktioniert, nur in ContainerView einstellen und funktioniert!
Felipe FMMobile
46

Ein weiterer schneller Kommentar ... auch in XCode 6.1, gibt es einen Fehler mit vertikalen Räumen an der Spitze erscheinen UIScrollViews, UITextViewsund UITableViews.

Geben Sie hier die Bildbeschreibung ein

Manchmal besteht die einzige Möglichkeit, dieses Problem zu beheben, darin, in das Storyboard zu gehen und das Problemsteuerelement zu ziehen, damit es nicht mehr die erste Unteransicht auf der Seite ist.

Geben Sie hier die Bildbeschreibung ein

(Mein Dank geht an Oded , der mich in diese Richtung gelenkt hat ... Ich poste diesen Kommentar, nur um ein paar Screenshots hinzuzufügen, um die Symptome zu demonstrieren und zu beheben.)

Mike Gledhill
quelle
1
Beachten Sie, dass dieser Fehler, errrr, auch in iOS 8 auftritt, wenn Sie eine UITextView als erstes Untersteuerelement auf Ihrer Seite haben. Es handelt sich also nicht nur um ein UITableView-Problem.
Mike Gledhill
1
Von allen Lösungen hat nur dieser Hack für mich funktioniert. Eine seltsame Lösung für einen seltsamen Fehler. Ich habe dieses Problem mit UITableview konfrontiert.
Mesbah
4
1 Million danke! Dies ist die einzige Lösung, die für mich funktioniert hat.
user139816
1
(Ich bin erstaunt, dass es 18 Monate später ist, und die Leser stimmen immer noch über diese Antwort ab. Hat Apple dieses Problem noch nicht ernsthaft behoben ?!)
Mike Gledhill
1
hat mein Leben gerettet! Vielen Dank. Wissen Sie, wie lange es gedauert hat, diese einfache kleine "Lösung" zu finden? grrh.
Mc.Stever
40

Gemäß dieser Übergangsanleitung für iOS7 von Apple werden die Inhaltseinfügungen der Bildlaufansicht automatisch angepasst. Der Standardwert von autoAdjustsScrollViewInsets ist auf YES festgelegt.

Der UIViewController mit UITableView sollte diese Eigenschaft auf NO setzen.

self.automaticallyAdjustsScrollViewInsets = NO;

Dies wird den Trick tun.

EDIT 1:

Auch könnte man versuchen -

self.navigationController.navigationBar.translucent = YES;

Dadurch wird auch die zusätzliche Polsterung auf der Oberseite entfernt.

girish_vr
quelle
Sehr gute Antwort, es sei denn, sie beantwortet die Frage nicht genau. Esilver spricht von einer Lücke von 35 Pixel, aber iOS7 fügt einen zusätzlichen Header von 20 Pixel hinzu: entspricht der Höhe der Statusleiste.
Martin
Lächerliches Problem. Danke für die Antwort.
Genki
Dies ist die Antwort auf ein anderes Problem.
Entonio
Vielen Dank, dass es für mich funktioniert hat. In meinem speziellen Fall war ein Tableviewcontroller in den Viewcontroller eingebettet, und durch die automatische Einstellung von AdjustsScrollViewInsets = false im Viewcontroller verschwand die obere Lücke
Alexey
39

Verwenden Sie diese Option, wenn Sie gruppierte TableView verwenden, um das Ausschneiden von Rahmen in viewWillAppear zu vermeiden

self.tableView.contentInset = UIEdgeInsetsMake(-35, 0, 0, 0);
Aqib Mumtaz
quelle
Versuchte alle anderen. Dies ist derjenige, der funktioniert hat! Thx
Michael vor
36

Viele der vorherigen Antworten sind zu hackig. Sie würden jederzeit in der Zukunft brechen, wenn Apple beschließt, dieses unerwartete Verhalten zu beheben.

Wurzel des Problems:

  1. a UITableViewmöchte keinen Header mit einer Höhe von 0,0 haben. Wenn Sie versuchen, einen Header mit einer Höhe von 0 zu haben, können Sie zur Lösung springen.

  2. Selbst wenn Sie Ihrem Header später eine Höhe von nicht 0,0 zuweisen, UITableViewmöchte a zunächst keinen Header mit einer Höhe von 0,0 zuweisen.

Lösung:

Die einfachste und zuverlässigste Lösung besteht darin, sicherzustellen, dass Ihre Headerhöhe nicht 0 ist, wenn Sie sie Ihrer Tabellenansicht zuweisen.

So etwas würde funktionieren:

// Replace UIView with whatever class you're using as your header below:
UIView *tableViewHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, self.tableView.bounds.size.width, CGFLOAT_MIN)];
self.tableView.tableHeaderView = tableViewHeaderView;

So etwas würde irgendwann zu dem Problem führen (normalerweise nach einer Schriftrolle):

// Replace UIView with whatever class you're using as your header below:
UIView *tableViewHeaderView = [[UIView alloc] initWithFrame:CGRectZero];
self.tableView.tableHeaderView = tableViewHeaderView;
Aurelien Porte
quelle
Schließlich fand ich die Antwort, die funktioniert. Vielen Dank. Außerdem habe ich erfahren, dass tableView.tableHeaderViewes sich tatsächlich um eine Zusatzansicht über dem Zeileninhalt handelt. Ich war den ganzen Weg mit Abschnittsüberschriften verwechselt, bis Ihre Antwort herauskam.
Joe Huang
1
CGFLOAT_MINwurde durch CGFloat.leastNormalMagnitudein Swift 3
Clay Ellis
29

Storyboard:

Deaktivieren Sie einfach: Adjust Scroll View Insetsin den Optionen des View Controllers

Geben Sie hier die Bildbeschreibung ein

Code:

self.automaticallyAdjustsScrollViewInsets = false
Bartłomiej Semańczyk
quelle
2
mit xcode 7 Ich sehe nicht Attribut Inspector> Layout, wo sollte ich self.automaticallyAdjustsScrollViewInsets = false hinzufügen
alex
in Sicht geladen.
CW0007007
23

Dies ist die Lösung für iOS 10 mit Swift 3:

Sie können die oberen und unteren Polster entfernen, indem Sie die folgenden Methoden aus dem implementieren UITableViewDelegate.

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat
{ 
    return CGFloat.leastNormalMagnitude
}

func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat
{
   return CGFloat.leastNormalMagnitude
}
AndreasLukas
quelle
Die zweite Seite auf SO hat mir geholfen ... Ich weiß nicht warum, vielleicht wegen der AutomaticDimension, vielleicht wegen der Einschränkungen mit der VFL, jedenfalls, danke! ozi bua ist tapfer! : D
Pentarex
Dies sind die Kopf- und Fußzeilen der Abschnitte . Die Frage bezieht sich auf den gesamten Tabellenkopf. Außerdem gibt es in beiden Delegatenmethoden nichts Spezielles für Swift3 oder iOS 10 (sie gibt es schon seit Ewigkeiten).
Nicolas Miari
14

In meinem Fall hat mir das geholfen. Ich unterstütze auch ios6.

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
    self.edgesForExtendedLayout = UIRectEdgeNone;
    self.extendedLayoutIncludesOpaqueBars = NO;
    self.automaticallyAdjustsScrollViewInsets = NO;
}
Lukas
quelle
Ich bin mir nicht sicher, was das macht, aber es hat perfekt funktioniert. Könnten Sie eine Erklärung geben?
Matt Wolfe
@MattWolfe Ich war verloren und habe diese Lösung gefunden. Ich bin mir auch nicht sicher, warum dies geschieht. Ich vermute, dass der Controller aufgrund der Statusleiste (oder in anderen Fällen der Symbolleiste / Registerkartenleiste) entscheidet, dass die Tabellenansicht einen Einschub benötigt, sodass dieser automatisch hinzugefügt wird. Ich habe wirklich Probleme mit einigen der neuen iOS7 "Funktionen". Vielleicht versteht es jemand und hat eine echte Erklärung dafür?
Lukas
Verbrachte die letzten 2 Tage damit, eine relativ kleine App auf iOS 7 zu portieren und hatte immer noch kleinere Probleme. Ich behebe sie in iOS 7, sie bricht in 6 und umgekehrt. Das macht mich verrückt!
Matt Wolfe
Dies ist ein anderes Problem als OP. Trotzdem wird für die gruppierte Tabellenansicht oben ein zusätzlicher Platz hinzugefügt.
RajV
1
Dies scheint die Schlüsselzeile zu sein: self.automaticallyAdjustsScrollViewInsets = NO; Nur die Einstellung, die den zusätzlichen Platz, den ich hatte, entfernte.
Mike M
14

Fügen Sie Ihrem viewDidLoad in Ihrem VC einfach Folgendes hinzu:

self.automaticallyAdjustsScrollViewInsets = NO;
judepereira
quelle
Dieser Fix hat funktioniert und ich ziehe es vor, die Einfügungen manuell mit magischen Zahlen einzustellen. Vielen Dank!
Wegfahrsperre
14

Also habe ich hier jede Methode ausprobiert, und diesmal hat keine von ihnen geholfen. Mein Fall war eine gruppierte Tabellenansicht unter iOS 9. Ich weiß nicht wirklich warum und wie ich diese herausgefunden habe, aber für mich hat das Einstellen tableViewHeadermit einer UIViewmit mindestens 0.01Höhe geklappt. CGRectZerohat nicht geholfen, nichts hat wirklich geholfen:

tableView.tableHeaderView = UIView(frame: CGRect(x: 0.0, y: 0.0, width: 0.0, height: 0.01))
sunshinejr
quelle
10

Swift: iOS Ich hatte eine Tabellenansicht in der Bildlaufansicht. Als ich auf demselben Bildschirm auf "Zurück" klickte. Die Bildlaufansicht nimmt oben mehr Platz ein. Um dies zu lösen, habe ich Folgendes verwendet:

 self.automaticallyAdjustsScrollViewInsets = false

Ein boolescher Wert, der angibt, ob der Ansichtscontroller seine Bildlaufansichten automatisch anpassen soll. Der Standardwert ist true. Dadurch kann der Ansichts-Controller seine Bildlaufansichten an die Bildschirmbereiche anpassen, die von der Statusleiste, der Navigationsleiste und der Symbolleiste oder der Registerkartenleiste belegt werden. Setzen Sie diesen Wert auf false, wenn Sie die Anpassungen der Bildlaufansicht selbst verwalten möchten, z. B. wenn die Ansichtshierarchie mehr als eine Bildlaufansicht enthält.

Vinod Joshi
quelle
10

Danke an die Antwort von @Aurelien Porte. Hier ist meine Lösung

Ursache dieses Problems: -

  1. Eine UITableView möchte keinen Header mit einer Höhe von 0,0 haben. Wenn Sie versuchen, einen Header mit einer Höhe von 0 zu haben, können Sie zur Lösung springen.
  2. Selbst wenn Sie Ihrem Header später eine Höhe von nicht 0,0 zuweisen, möchte einem UITableView zunächst kein Header mit einer Höhe von 0,0 zugewiesen werden.

In ViewDidLoad: -

self.edgesForExtendedLayout = UIRectEdge.None

self.automaticallyAdjustsScrollViewInsets = false

Keine Notwendigkeit für so etwas: -

self.myTableview.contentInset = UIEdgeInsetsMake(-56, 0, 0, 0)

Im heightForHeaderInSectionDelegierten: -

if section == 0
    {
        return 1
    }
    else
    {
        return 40; // your other headers height value
    }

Im viewForHeaderInSectionDelegierten: -

if section == 0 
{  
   // Note CGFloat.min for swift
   // For Objective-c CGFLOAT_MIN 
   let headerView = UIView.init(frame: CGRectMake(0.0, 0.0, self.myShaadiTableview.bounds.size.width, CGFloat.min)) 
   return headerView
}
else
{ 
   // Construct your other headers here 
}
Ashish Pisey
quelle
10

So kann es einfach in iOS 11 und Xcode 9.1 behoben werden über Storyboard :

Wählen Sie Tabellenansicht> Größeninspektor> Inhaltseinfügungen: Nie

Saeed Ir
quelle
1
Arbeitete für mich :)
Bhupinder
Großartig! Danke :)
Saeed Ir
1
Dies ist statt automaticallyAdjustsScrollViewInsetsin ios 11
Nik Kov
9

Ich gehe davon aus, dass dies nur ein Teil des neuen UITableViewStyleGroupedStils ist. Es befindet sich in allen gruppierten Tabellenansichten und es scheint keine direkte Möglichkeit zu geben, diesen Bereich zu steuern.

Wenn dieser Raum durch eine dargestellt wird UIView, wäre es möglich, durch alle zur Suche subviewsderUITableView , dass bestimmten Anzeigen und Bearbeiten von ihm direkt zu finden. Es besteht jedoch auch die Möglichkeit, dass dieser Speicherplatz nur ein fest codierter Versatz ist, bevor Header und Zellen gestartet werden, und dass es keine Möglichkeit gibt, ihn zu bearbeiten.

So durchsuchen Sie alle Unteransichten (ich würde diesen Code ausführen, wenn die Tabelle keine Zellen enthält, um das Lesen der Ausgabe zu erleichtern):

- (void)listSubviewsOfView:(UIView *)view {

    // Get the subviews of the view
    NSArray *subviews = [view subviews];

    // Return if there are no subviews
    if ([subviews count] == 0) return;

    for (UIView *subview in subviews) {

        NSLog(@"%@", subview);

        // List the subviews of subview
        [self listSubviewsOfView:subview];
    }
}
Kevin
quelle
3
Wenn uns UITableViews (genauer gesagt UITableViewCellScrollView) unter iOS7 eines beigebracht haben, ist es, die Ansichtshierarchie der integrierten Klassen in Ruhe zu lassen.
Matthias Bauch
Guter Punkt. Die andere Option ist ... für jedes iOS weiter zu hacken;)
Dan Rosenstark
Hoppla, ja. Soll diese Warnung schreiben, aber vergessen.
Kevin
Kevin - Ich denke du hast recht, das ist beabsichtigt. Es scheint, dass die Rückgabe von 0 für heightForHeaderInSection der einfachste Weg ist, diese Auffüllung zu entfernen. Aus irgendeinem Grund funktionierte es in dieser bestimmten Instanz nicht für mich, aber in anderen UITableViews.
Silber
1
Es ist definitiv "beabsichtigt". Wenn Sie die Ausführung angehalten und ausgeführt haben: po [((UIApplication *)UIApplication.sharedApplication).keyWindow recursiveDescription]Sie werden sehen, dass der Tabellenkopf oder der Kopf des ersten Abschnitts oder die erste Zelle (je nachdem, was Sie verwenden) natürlich einen 35-Pixel-Rand hinterlässt .... boo.
Herr T
9

Meine Antwort wird eine allgemeinere Antwort sein, kann aber auch darauf angewendet werden.

Wenn die Stammansicht (des Viewcontroller ) oder das erste Kind (subview) der Stammansicht ist Unterklasse der UIScrollView (oder UIScrollView selbst), und wenn

self.navigationController.navigationBar.translucent = YES;

Das Framework legt automatisch das vorberechnete contentInset fest .


Um dies zu vermeiden, können Sie tun

self.automaticallyAdjustsScrollViewInsets = NO;

In meinem Fall war dies jedoch nicht möglich, da ich ein SDK mit einer UIView-Komponente implementiert habe, die von anderen Entwicklern verwendet werden kann. Diese UIView-Komponente enthält UIWebView (mit UIScrollView als erster Unteransicht). Wenn diese Komponente als erstes untergeordnetes Element in der Ansichtshierarchie von UIViewController hinzugefügt wird, werden automatische Einfügungen vom System angewendet.

Ich habe dies behoben, indem ich vor dem Hinzufügen von UIWebView eine Dummy-Ansicht mit Frame (0,0,0,0) hinzugefügt habe.

In diesem Fall hat das System die Unterklasse von UIScrollView nicht als erste Unteransicht gefunden und keine Einfügungen angewendet

zvjerka24
quelle
Lebensretter! dankeself.automaticallyAdjustsScrollViewInsets = false
ethanneff
8

Dieser Code hat für mich funktioniert. Die beste Antwort für mich, die oben geschrieben wurde objective-C, also habe ich ihn in Swift konvertiert.

Für Swift 4.0+

self.tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: self.tableView.bounds.size.width, height: 0.01))

Schreiben Sie dies einfach in viewDidLoad()und es wird wie ein Zauber funktionieren.

Vipul Kumar
quelle
1
Vielen Dank, hat gut für mich funktioniert.
Angelo Polotto
1
Ihr willkommenes glückliches Codieren
Vipul Kumar
7

Ich hatte die gleiche Lösung wie Arielyz. Nachdem ich die UITableView so verschoben hatte, dass sie nicht die erste Unteransicht der übergeordneten Ansicht war, verschwand sie. Mein Platz war 20 px, nicht 35.

Ich konnte es nicht in einem Hochformat xib nachbilden, sondern nur in einem Querformat xib. Ich werde später einen Radarfehler melden, wenn ich ihn in einer einfachen Demo-App reproduzieren kann.

Oded
quelle
Ist auf dasselbe Problem gestoßen, konnte es nicht durch Ändern des contentInset lösen, aber diese Methode hat funktioniert, obwohl sie ziemlich hackig ist. Mit dem visuellen Debugging-Tool konnte ich feststellen, dass der UITableView zwar die richtige Höhe hatte, der darin enthaltene UITableViewWrapper jedoch nicht.
Mic Fok
Perfekt. Dies hat den Fehler für mich in XCode 6.1 behoben. Keiner der anderen Vorschläge auf dieser StackOverflow-Seite machte einen Unterschied. Ich hatte eine UITableView in einer UIView und es war die erste Unteransicht. Durch Ziehen in die zweite Unteransicht wurde das Problem perfekt behoben. (Wenn mich jemand braucht, bin ich in der Kneipe.)
Mike Gledhill
Vielen Dank! Dies funktioniert auch, wenn Sie einen Tabellenansichts-Controller in einem Container haben. Wenn Sie den Container so verschieben, dass er nicht der erste in der Ansicht der Eltern ist, wird die Lücke oben in der Tabellenansicht entfernt.
Strangeluck
7

Ich denke, UIEdgeInsets -35 0 0 0 zu machen ist mühsam. In meinem Fall habe ich die Methode tableView: heightForHeaderInSection: implementiert und kann möglicherweise 0 zurückgeben.

Als ich 0 auf 0.1f änderte, ging das Problem einfach weg.

Jiangfan Du
quelle
1
Wenn ich könnte, würde ich dies mehr als einmal positiv bewerten. Muss ein seltsamer Autolayout-Fehler sein oder so ... Da alles> 0 funktioniert, schlage ich vor, anstelle von 0,1 FLT_EPSILON oder DBL_EPSILON zu verwenden, da beide den kleinen positiven Wert darstellen, so dass 1,0 + epsilon! = 1,0
Henri Normak
7

Das einzige, was für mich funktioniert hat, war:

Swift :

tableView.sectionHeaderHeight = 0
tableView.sectionFooterHeight = 0

Ziel-C :

self.tableView.sectionHeaderHeight = 0;
self.tableView.sectionFooterHeight = 0;

Außerdem hatte ich noch zusätzlichen Platz für den ersten Abschnitt. Das lag daran, dass ich die tableHeaderViewEigenschaft falsch verwendet habe. Das wurde ebenfalls behoben, indem Folgendes hinzugefügt wurde:

self.tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: tableView.frame.size.width, height: 0.01))
Danut Pralea
quelle
Funktioniert für mich für Swift 4.2. Danke
Sylar
Versuchte alles auf dieser Seite, für iOS13 gruppierte Tabellenansicht mit Header-Ansicht. self.tableView.tableHeaderView = UIView (Frame: CGRect (x: 0, y: 0, Breite: tableView.frame.size.width, Höhe: 0,01)). Das Problem wurde behoben.
Ning
7

Um genau zu sein, um tableviewHeader-Speicherplatz von oben zu entfernen, habe ich folgende Änderungen vorgenommen:

YouStoryboard.storyboard> YouViewController> Wählen Sie TableView> Größeninspektor> Inhaltseinfügungen - Setzen Sie es auf nie.

Geben Sie hier die Bildbeschreibung ein

user832
quelle
Was sind die zusätzlichen Informationen außer dem Screenshot im Vergleich zu dieser Antwort ?
Artjom B.
Es ist das gleiche, denke ich, ich habe diese Antwort nicht gefunden, als ich nach einer Lösung gesucht habe. Soll ich dann meine Antwort löschen ..?
user832
Nicht, wenn Sie Ihre Antwort ein wenig erweitern können, indem Sie beschreiben, warum Inhaltseinfügungen = Dieses Problem nie lösen (wie funktioniert diese Option?).
Artjom B.
Wenn Inhaltseinfügungen auf "Nie" gesetzt sind, wird die Tabellenansicht bei der Textfeldbearbeitung nicht nach oben gescrollt.
Mojtaba al Moussawi
6

benutze dieses ich denke diese Hilfe ...

 - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
 {
    return 0.005f;// set this according to that you want...
 }
Shahzaib Maqbool
quelle
1
Brillant! Funktioniert wie ein Zauber in iOS 9.2. Diese Antwort ist perfekt, da ich in einigen Fällen den ersten Header unterdrücken muss, während ich ihn in anderen Fällen zeige. Ich habe eine andere Antwort mit CGFloat.min gesehen, die auch funktioniert. So kann mein viewController jetzt entweder eine reelle Zahl wie 44.0 oder im Wesentlichen 0 liefern.
David H
6
override func viewWillAppear(animated: Bool) {
        self.edgesForExtendedLayout = UIRectEdge.None

 //  OR

self.sampleTableView.contentInset = UIEdgeInsetsMake(-64, 0, 0, 0);

   //OR

 self.automaticallyAdjustsScrollViewInsets = false
        }
AG
quelle
automatischAdjustsScrollViewInsets = falsche Arbeit von mir! Danke!
Daniel Kuta
6
-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{

    return CGFLOAT_MIN;
}

Das war's Leute!

HannahCarney
quelle