Ab iOS7 gibt es oben auf meinen zusätzlichen Speicherplatz, der UITableView
einen Stil hat UITableViewStyleGrouped
.
Hier ist ein Beispiel:
Die Tabellenansicht beginnt beim ersten Pfeil, es gibt 35 Pixel unerklärlichen Abstand, dann wird der grüne Header UIView
von 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
ios
uitableview
ios7
Silber
quelle
quelle
UITableView
keine Überschrift mit einer Höhe von 0,0 zugewiesen werden soll. Weitere Informationen finden Sie unter stackoverflow.com/a/31223403/1394534 .self.tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 0.0f, CGFLOAT_MIN)];
Hinweis: Wird0.0f
nur 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).Antworten:
Folgendes hat mir geholfen:
YouStoryboard.storyboard> YouViewController> Attributinspektor> Deaktivieren - Bildlaufansichten anpassen.
quelle
collectionview
. (Wenn Tischansicht drinnen istcollectionviewcell
)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 musstableHeaderView
, anstatt Folgendes zuself.tableView.tableHeaderView = nil;
tun:Ich mag diese Lösung besser als eine etwas willkürliche,
contentInset.top
weil ich sie auchcontentInset.top
dynamisch benutze . EscontentInset.top
ist mühsam , daran zu denken, bei jeder Neuberechnung zusätzliche 35 Pixel zu entfernen .quelle
Debug > Color Misaligned Images
den Simulator ein, um sich selbst davon zu überzeugen.) Das möchten Sie nicht.UITableViewHeaderFooterView
anstelle von UIView zu verwenden. UndCGFLOAT_MIN
funktioniert genauso,0.01f
aber theoretisch besser.Wenn Sie für IOS 7 eine Tabellenansicht in einem Ansichtscontroller zuweisen, können Sie dies untersuchen
Ihr Problem schien meinem ähnlich zu sein
Aktualisieren:
Swift in iOS 9.x:
Swift 3:
quelle
UITableView
. Die Probleme rühren von der Tatsache her, dass ich michUITableView
in einemUIViewController
Inneren befand,UINavigationController
was dazu führte, dass der Tabelleninhalt um 44 Punkte abfiel, sodass der anfängliche Inhalt nicht hinter dem lagnavBar
. Das wurde bei meinem Layout jedoch nicht benötigt, sodass es nur Probleme verursachte. Schließlich habe ich meinen Code geändert,automaticallyAdjustsScrollViewInsets
der auch funktioniert hat.edgesForExtendedLayout = []
Versuchen Sie, die
contentInset
Eigenschaft zu ändern, von derUITableView
geerbt wirdUIScrollView
.Es ist eine Problemumgehung, aber es funktioniert
quelle
contentTableView.contentInset = UIEdgeInsetsMake(-20, 0, -20, 0);
funktionierte am besten für mich, weil es oben und unten 20 zusätzliche Pixel gab.versuchen Sie, Sie können damit umgehen!
quelle
uncheck Adjust scroll view insets
. Weil wir manchmal kein Storyboard verwenden, um unsere Benutzeroberfläche zu erstellen.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).
Dies ist vielleicht keine elegante Lösung, funktioniert aber für mich
Schnelle Version:
quelle
override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { return section == 0 ? 14 : 24 }
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,
Oben wird ein zusätzlicher Platz von 35 Pixel vorhanden sein. Wenn Zeile 27 aktiv und 24 auskommentiert ist,
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.
quelle
tableView:heightForHeaderInSection:
undtableView: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.Deaktivieren Sie "Bildlaufansichten anpassen".
quelle
Ein weiterer schneller Kommentar ... auch in XCode 6.1, gibt es einen Fehler mit vertikalen Räumen an der Spitze erscheinen
UIScrollViews
,UITextViews
undUITableViews
.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.
(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.)
quelle
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.
Dies wird den Trick tun.
EDIT 1:
Auch könnte man versuchen -
Dadurch wird auch die zusätzliche Polsterung auf der Oberseite entfernt.
quelle
Verwenden Sie diese Option, wenn Sie gruppierte TableView verwenden, um das Ausschneiden von Rahmen in viewWillAppear zu vermeiden
quelle
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:
a
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.Selbst wenn Sie Ihrem Header später eine Höhe von nicht 0,0 zuweisen,
UITableView
mö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:
So etwas würde irgendwann zu dem Problem führen (normalerweise nach einer Schriftrolle):
quelle
tableView.tableHeaderView
es sich tatsächlich um eine Zusatzansicht über dem Zeileninhalt handelt. Ich war den ganzen Weg mit Abschnittsüberschriften verwechselt, bis Ihre Antwort herauskam.CGFLOAT_MIN
wurde durchCGFloat.leastNormalMagnitude
in Swift 3Storyboard:
Deaktivieren Sie einfach:
Adjust Scroll View Insets
in den Optionen des View ControllersCode:
quelle
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
.quelle
In meinem Fall hat mir das geholfen. Ich unterstütze auch ios6.
quelle
Fügen Sie Ihrem viewDidLoad in Ihrem VC einfach Folgendes hinzu:
quelle
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
tableViewHeader
mit einerUIView
mit mindestens0.01
Höhe geklappt.CGRectZero
hat nicht geholfen, nichts hat wirklich geholfen:quelle
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:
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.
quelle
Danke an die Antwort von @Aurelien Porte. Hier ist meine Lösung
Ursache dieses Problems: -
In ViewDidLoad: -
Keine Notwendigkeit für so etwas: -
Im
heightForHeaderInSection
Delegierten: -Im
viewForHeaderInSection
Delegierten: -quelle
So kann es einfach in iOS 11 und Xcode 9.1 behoben werden über Storyboard :
Wählen Sie Tabellenansicht> Größeninspektor> Inhaltseinfügungen: Nie
quelle
automaticallyAdjustsScrollViewInsets
in ios 11Ich gehe davon aus, dass dies nur ein Teil des neuen
UITableViewStyleGrouped
Stils 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 Suchesubviews
derUITableView
, 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):
quelle
UITableViewCellScrollView
) unter iOS7 eines beigebracht haben, ist es, die Ansichtshierarchie der integrierten Klassen in Ruhe zu lassen.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.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
Das Framework legt automatisch das vorberechnete contentInset fest .
Um dies zu vermeiden, können Sie tun
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
quelle
self.automaticallyAdjustsScrollViewInsets = false
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.Schreiben Sie dies einfach in
viewDidLoad()
und es wird wie ein Zauber funktionieren.quelle
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.
quelle
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.
quelle
Das einzige, was für mich funktioniert hat, war:
Swift :
Ziel-C :
Außerdem hatte ich noch zusätzlichen Platz für den ersten Abschnitt. Das lag daran, dass ich die
tableHeaderView
Eigenschaft falsch verwendet habe. Das wurde ebenfalls behoben, indem Folgendes hinzugefügt wurde:quelle
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.
quelle
benutze dieses ich denke diese Hilfe ...
quelle
quelle
Das war's Leute!
quelle