Ab iOS7 gibt es am oberen Rand meiner UITableView
zusätzlichen Speicherplatz, der einen Stil UITableViewStyleGrouped
hat.
Hier ist ein Beispiel:
Die Tabellenansicht beginnt beim ersten Pfeil, es gibt 35 Pixel unerklärlicher Auffüllung, dann ist der grüne Header eine UIView
, die von viewForHeaderInSection
zurückgegeben wird (wobei der Abschnitt 0 ist).
Kann jemand erklären, woher diese 35 Pixel kommen und wie ich sie loswerden kann, ohne zu UITableViewStylePlain
zu wechseln?
Ich habe die Ursache meines ursprünglichen Fehlers gefunden und ein Beispielprojekt erstellt, in dem der Fehler gezeigt wird. Ich glaube, es gibt einen iOS7-Fehler.
Wenn Sie ab iOS7 eine UITableView mit dem gruppierten Stil erstellen, für das erste Layout jedoch kein Delegat festgelegt ist, dann einen Delegaten festlegen und reloadData aufrufen, wird am oberen Rand ein 35px-Bereich angezeigt, der niemals verschwinden wird.
Sehen Sie sich dieses Projekt an, das ich gemacht habe, um den Fehler zu präsentieren: 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];
es wird ein zusätzlicher Platz von 35 px an der Spitze vorhanden sein. Wenn Zeile 27 aktiv ist und 24 auskommentiert ist,
self.tableView.delegate = self;
kein Platz an der Spitze Es ist, als würde die tableView ein Ergebnis irgendwo zwischenspeichern und sich nicht selbst neu zeichnen, nachdem der Delegat gesetzt und reloadData aufgerufen wurde.
Ich habe ein bisschen mehr damit herumgespielt und es scheint, als wäre dies ein Nebeneffekt, wenn der tableHeaderView = nil
der tableView gesetzt wird.
Da meine tableView eine dynamisch erscheinende tableHeaderView
hat und ich die tableHeaderView
ausblenden muss, anstatt self.tableView.tableHeaderView = nil;
auszuführen, mache ich Folgendes:
self.tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, self.tableView.bounds.size.width, 0.01f)];
Diese Lösung gefällt mir besser, als einen etwas willkürlichen contentInset.top
einzustellen, da ich contentInset.top
auch dynamisch verwende. Ich muss daran denken, einen zusätzlichen 35px zu entfernen, wenn contentInset.top
neu berechnet wird, umständlich.
Wenn Sie für IOS 7 eine Tableview in einem View-Controller zuweisen, können Sie dies überprüfen
self.edgesForExtendedLayout = UIRectEdgeNone;
ihr Problem schien mir ähnlich
Update:
Schnell in iOS 9.x:
self.edgesForExtendedLayout = UIRectEdge.None
Swift 3:
self.edgesForExtendedLayout = UIRectEdge.init(rawValue: 0)
Ändern Sie die contentInset
-Eigenschaft, die UITableView
von UIScrollView
erbt.
self.tableView.contentInset = UIEdgeInsetsMake(-36, 0, 0, 0);
Es ist eine Problemumgehung, aber es funktioniert
self.automaticallyAdjustsScrollViewInsets = NO;
versuchen Sie, Sie können damit umgehen!
Sie könnten feststellen, ob in Ihrer App iOS7 oder höher ausgeführt wird, und diese beiden Methoden in Ihren Delegierten zur Tabellensicht 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
Swift-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
}
Noch ein kurzer Kommentar ... selbst in XCode 6.1 gibt es einen Fehler mit vertikalen Leerzeichen am oberen Rand von UIScrollViews
, UITextViews
und UITableViews
.
Die einzige Möglichkeit, dieses Problem zu beheben, besteht manchmal darin, in das Storyboard zu gehen und das Problemsteuerelement zu ziehen, sodass es nicht mehr die Unteransicht first auf der Seite ist.
(Mein Dank geht an Oded , dass Sie mich in diese Richtung weisen ... Ich poste diesen Kommentar, nur um ein paar Screenshots hinzuzufügen, um die Symptome zu zeigen und zu beheben.)
Gemäß diesem Übergangsleitfaden für iOS7 von Apple werden die Inhaltsinsets der Bildlaufansicht automatisch angepasst. .__ Der Standardwert von automaticAdjustsScrollViewInsets ist auf YES gesetzt.
Der UIViewController mit der UITableView sollte diese Eigenschaft auf NO setzen.
self.automaticallyAdjustsScrollViewInsets = NO;
Das wird den Trick tun.
EDIT 1:
Man könnte auch versuchen -
self.navigationController.navigationBar.translucent = YES;
Dadurch wird auch die zusätzliche Polsterung auf der Oberseite entfernt.
Verwenden Sie diese Option, wenn Sie gruppierte TableView verwenden, um das Schneiden von Rändern in viewWillAppear zu vermeiden
self.tableView.contentInset = UIEdgeInsetsMake(-35, 0, 0, 0);
Viele der obigen Antworten sind zu hackig. Sie würden jederzeit in der Zukunft brechen, wenn sich Apple dazu entscheidet, dieses unerwartete Verhalten zu beheben.
Wurzel des Problems:
eine UITableView
möchte keine Kopfzeile mit einer Höhe von 0.0 haben. Wenn Sie versuchen, eine Kopfzeile mit einer Höhe von 0 zu erstellen, können Sie zur Lösung springen.
selbst wenn Sie später einer Kopfzeile eine Höhe von nicht 0.0 zuweisen, wird der UITableView
keine Kopfzeile mit der Höhe 0,0 zugewiesen.
Lösung:
Die einfachste und zuverlässigste Lösung besteht darin, sicherzustellen, dass Ihre Kopfhö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 zu einem bestimmten Zeitpunkt (normalerweise nach einem Bildlauf) zu dem Problem führen:
// Replace UIView with whatever class you're using as your header below:
UIView *tableViewHeaderView = [[UIView alloc] initWithFrame:CGRectZero];
self.tableView.tableHeaderView = tableViewHeaderView;
Storyboard:
Deaktivieren Sie einfach: Adjust Scroll View Insets
in den Optionen von View Controller
Code:
self.automaticallyAdjustsScrollViewInsets = false
Dies ist die Lösung für iOS 10, die Swift 3 verwendet:
Sie können obere und untere Auffüllungen entfernen, indem Sie die folgenden Methoden aus UITableViewDelegate
implementieren.
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat
{
return CGFloat.leastNormalMagnitude
}
func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat
{
return CGFloat.leastNormalMagnitude
}
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;
}
Also habe ich hier jede Methode ausprobiert und diesmal hat keine davon geholfen. Mein Fall war eine gruppierte Tabellenansicht auf iOS 9. Ich weiß nicht wirklich, warum und wie ich dies herausgefunden habe, aber für mich wurde die tableViewHeader
mit einer UIView
eingestellt, wobei mindestens die 0.01
-Höhe ermittelt wurde. CGRectZero
hat nicht geholfen, nichts hat wirklich geholfen:
tableView.tableHeaderView = UIView(frame: CGRect(x: 0.0, y: 0.0, width: 0.0, height: 0.01))
Fügen Sie Ihrem viewDidLoad in Ihrem VC einfach Folgendes hinzu:
self.automaticallyAdjustsScrollViewInsets = NO;
Danke an die Antwort von @Aurelien Porte. Hier ist meine Lösung
Ursache für dieses Problem: -
In ViewDidLoad: -
self.edgesForExtendedLayout = UIRectEdge.None
self.automaticallyAdjustsScrollViewInsets = false
Kein Bedarf für so etwas: -
self.myTableview.contentInset = UIEdgeInsetsMake(-56, 0, 0, 0)
In heightForHeaderInSection
Delegat: -
if section == 0
{
return 1
}
else
{
return 40; // your other headers height value
}
In viewForHeaderInSection
Delegat: -
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
}
Swift: iOS hatte ich TableView auf Scroll-Ansicht .. als ich auf dem gleichen Bildschirm auf "Zurück" geklickt habe. Scroll-Ansicht mehr Platz auf der Oberseite nehmen .. um das zu lösen habe ich verwendet:
self.automaticallyAdjustsScrollViewInsets = false
Ein boolescher Wert, der angibt, ob der Ansichtscontroller seine Bildlaufansichtsinsets automatisch anpassen soll . Der Standardwert ist "true". Dies ermöglicht dem Viewcontroller, seine Bildlaufansichtsinsets an die Bildschirmbereiche anzupassen, die von der Statusleiste oder der Navigationsleiste belegt werden und Symbolleiste oder Registerkartenleiste. Setzen Sie den Wert auf "false", wenn Sie die Anpassungen der Bildlaufansicht selbst verwalten möchten, z. B. wenn in der Ansichtshierarchie mehr als eine Bildlaufansicht vorhanden ist.
Meine Antwort wird allgemeiner sein, kann aber auch darauf angewendet werden.
Wenn die root-Ansicht (des ViewController ) oder das erste Kind (Unteransicht) der Root-Ansicht eine Unterklasse der UIScrollView (oder der UIScrollView selbst) ist und wenn
self.navigationController.navigationBar.translucent = YES;
framework wird automatisch vorberechnetes contentInset setzen.
Um dies zu vermeiden, können Sie dies tun
self.automaticallyAdjustsScrollViewInsets = NO;
in meinem Fall war ich jedoch nicht in der Lage, da ich SDK implementierte, das eine UIView-Komponente enthält, die von anderen Entwicklern verwendet werden kann. Diese UIView-Komponente enthält UIWebView (die UIScrollView als erste Unteransicht hat). 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 Dummy-Ansicht mit Frame (0,0,0,0) vor dem Hinzufügen von UIWebView hinzufügte.
In diesem Fall hat das System keine Unterklasse des UIScrollView als erste Unteransicht gefunden und keine Einfügungen angewendet
Ich gehe davon aus, dass dies nur ein Teil des neuen UITableViewStyleGrouped
-Stylings ist. Es ist in allen gruppierten Tabellenansichten vorhanden und es scheint keine direkte Möglichkeit zu geben, diesen Platz zu steuern.
Wenn dieses Leerzeichen durch eine UIView
dargestellt wird, ist es möglich, alle subviews
der UITableView
zu durchsuchen, um diese bestimmte Ansicht zu finden und direkt zu bearbeiten. Es besteht jedoch auch die Möglichkeit, dass dieser Abstand nur einen hartcodierten Versatz darstellt, bevor Header und Zellen beginnen, und es gibt keine Möglichkeit, ihn zu bearbeiten.
Durchsuchen aller Unteransichten (Ich würde diesen Code ausführen, wenn die Tabelle keine Zellen enthält, um das Lesen der Ausgabe ein wenig 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];
}
}
So kann es in iOS 11 und Xcode 9.1 über Storyboard problemlos behoben werden
Wählen Sie Table View> Size Inspector> Content Insets: Never
Ich finde es sehr langweilig, UIEdgeInsets -35 0 0 0 zu machen. In meinem Fall habe ich die Methode tableView: heightForHeaderInSection: implementiert, und es besteht die Möglichkeit, dass 0 zurückgegeben wird.
Als ich 0 auf 0,1f änderte, ging das Problem einfach weg.
Ich hatte das gleiche Problem wie Arielyz. Nachdem ich UITableView nicht als erste Unteransicht der übergeordneten Ansicht verschoben hatte, verschwand es. Mein Platz war 20 px, nicht 35.
Ich konnte es nicht in einem Hochformat-Xib neu erstellen, nur in einem Landschafts-Xib. Ich werde später einen Radar-Bug einreichen, wenn ich ihn in einer einfachen Demo-App reproduzieren kann.
override func viewWillAppear(animated: Bool) {
self.edgesForExtendedLayout = UIRectEdge.None
// OR
self.sampleTableView.contentInset = UIEdgeInsetsMake(-64, 0, 0, 0);
//OR
self.automaticallyAdjustsScrollViewInsets = false
}
Das einzige, was für mich funktionierte, war:
Swift :
tableView.sectionHeaderHeight = 0
tableView.sectionFooterHeight = 0
Ziel c :
self.tableView.sectionHeaderHeight = 0;
self.tableView.sectionFooterHeight = 0;
Ich hatte auch noch einen zusätzlichen Platz für den ersten Abschnitt. Das lag daran, dass ich die tableHeaderView
-Eigenschaft falsch verwendet habe. Auch das Problem wurde behoben, indem Folgendes hinzugefügt wurde:
self.tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: tableView.frame.size.width, height: 0.01))
verwenden Sie dieses Ich denke, diese Hilfe ...
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
return 0.005f;// set this according to that you want...
}
-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{
return CGFLOAT_MIN;
}
Das war's Leute!
Dafür haben wir mehrere Antworten.
1) Sie können UIImageview beim view didload hinzufügen
UIImageView * imbBackground = [UIImageView new];
[self.view addSubview:imbBackground];
2) Sie können die Kopf- und Fußzeile auf 0,1 einstellen
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
{
return 0.1;
}
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{
return 0.1;
}
3) Sie können die Kopf- und Fußzeilenansicht mit der Höhe 0,1 hinzufügen
tblCampaigns.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, tblCampaigns.bounds.size.width, 0.01f)];
tblCampaigns.tableFooterView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, tblCampaigns.bounds.size.width, 0.01f)];
Ich habe meinen Kopf auch gegen diesen gekämpft. Ich bin mir ziemlich sicher, dass dies ein iOS7-Fehler ist. Was mir letztendlich geholfen hat, ist die Reihenfolge der Aufrufe in der Xib. Ich hatte eine Ansicht, in der die Tabellenansicht korrekt angezeigt wurde, und eine andere, in der die Tabellenansicht über zusätzlichen 35px-Speicherplatz verfügte. Der einzige Unterschied (nach UITableView) besteht darin, dass UITableView in der Ansicht mit schlechter Darstellung das erste Kind war, während es in der Ansicht, die korrekt angezeigt wurde, der zweite war.
Das war für mich der Trick, nur die Reihenfolge der Ansichten zu ändern. Ich ziehe es wirklich vor, keine zusätzlichen Codezeilen für eine Problemumgehung hinzuzufügen ...
Befestigen Sie einfach Ihre Tabellenansicht (oder lassen Sie sie beginnen) an der absoluten Spitze der Ansicht. Der zusätzliche unerwünschte Platz entspricht genau der Höhe einer Navigationsleiste.
tableView.contentInsetAdjustmentBehavior = .never
war die Lösung für mich (iOS12/xcode 10) auf einem einfachen Tableview mit Kopfzeilen
Wenn Sie unter (Swift) arbeiten, wird das Problem gelöst. aber Dies funktioniert, wenn Sie keinen Header benötigen.
func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return CGFloat.min
}
In diesem Fall müssen Sie den ersten Abschnitt abbrechen und für den Inhalt "other" verwenden.
UITableViewDataSource
Implementierung:
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return <number_of_data_sections>+1
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// the first section we don't use for data
if section == 0 {
return 0
}
// starting from 1, there are sections we use
if section == 1 {
let dataSection = section - 1
// use dataSection for your content (useful, when data provided by fetched result controller). For example:
if let sectionInfo = myFRC!.sections![dataSection] as? NSFetchedResultsSectionInfo {
return sectionInfo.numberOfObjects
}
}
return 0
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let dataIndexPath = NSIndexPath(forRow: indexPath.row, inSection: (indexPath.section - 1) )
// return cell using transformed dataIndexPath
}
func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
if section == 1 {
// return your header height
}
return CGFloat.min
}
func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
if section == 1 {
// return your header view
}
return nil
}
func tableView(tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
// in my case, even when 1st section header was of zero heigh, I saw the space, an that was a footer. I did not need footer at all, so always gave zero height
return CGFloat.min
}
Und das ist es. Das Modell weiß nichts von der Änderung, weil wir die Abschnittsnummer beim Zugriff auf die Daten umwandeln.
Ich habe gerade entfernt UITableView
aus Interface Builder
, noch einmal erstellt und seltsame 35px sind weg.
Es scheint, dass es einen seltsamen Fehler in Interface Builder
gibt.
wenn Sie den Stil von UITableViewStyleGrouped auswählen, müssen Sie die Delegierungsmethode Header
und Footer
height implementieren. so was:
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{
return CGFLOAT_MIN;
}
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section{
return CGFLOAT_MIN;
}
Wenn Sie Ihre tableHeaderView ausblenden müssen, sollten Sie diesen Swift 3-Code verwenden:
tableView.tableHeaderView = UIView(frame: CGRect(Origin: .zero, size: CGSize(width: 0.0, height: CGFloat.leastNormalMagnitude)))
Mit Storyboard:
Stellen Sie sicher, dass Ihre UITableView-Einschränkung nicht "Unter Anleitung für Top-Layout" sagt. Stattdessen sollte "Top space to: Superview" (Superview.Top) angezeigt werden.
Plus natürlich im UIViewController, der die UITableView enthält, deaktivieren Sie "Scroll-View-Insets anpassen".
Swift 4-Code: Für die Tabellenansicht ohne Abschnittsheader können Sie diesen Code hinzufügen:
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return CGFloat.leastNormalMagnitude
}
und Sie erhalten den Headerabstand auf 0.
Wenn Sie möchten, dass eine Kopfzeile Ihrer spezifischen Höhe diesen Wert überschreitet:
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return header_height
}
und die Ansicht von ViewForHeaderinSection-Delegaten.
self.automaticallyAdjustsScrollViewInsets = NO;
Dies wurde in iOS 11 nicht mehr empfohlen. Sie sollten also die neue Eigenschaft contentInsetAdjustmentBehavior
in Ihrem Code verwenden. Sie sollte das Problem beheben.
if #available(iOS 11.0, *) {
collectionView.contentInsetAdjustmentBehavior = .never
}
In UIScrollView gibt es eine neue Eigenschaft mit dem Namen contentInsetAdjustmentBehavior, die in iOS 11 hinzugefügt wurde, um den Inhaltsversatz anzupassen
Ich habe einen VC mit einem Container darin (der übrigens Teil eines Nav-Controllers ist), und darin ist eine TableVC eingebettet.
Wählen Sie meine TableVC aus und sehen Sie sich das Attributfenster an:
Dann setze ich die Autoconstraint für den Container relativ zur übergeordneten Ansicht wie folgt:
Container View.top = Rand von ParentView.Top
Dies führt für mich zu folgenden Ergebnissen:
Bei diesem Setup habe ich viel ausprobiert, aber ich habe schließlich diese kleinen Details gefunden, die von lekksi @ Leeren Raum vor Zellen in UITableView entfernen gepostet wurden
Ich habe bemerkt, dass es viele Antworten auf diese Frage gibt, abhängig davon, was Sie versuchen, also würde ich meine weitergeben, falls jemand etwas mit dem gleichen Effekt anstrebt:
In meinem Ansichtscontroller habe ich eine gruppierte UITableView
, deren tableHeaderView
aus einer 200-punkt-hohen UIScrollView
und einer einzigen zugeordneten UILabel
besteht, die einen Anzeigentitel, den Preis, den Ort und die gebuchte Zeit enthält. Darunter befindet sich der Inhalt der Tabellenansicht.
Bei den Standarddimensionen eines gruppierten Tabellensichtheads befindet sich der Header "MORE INFO" zu weit unter der Bezeichnung "Vor 5 Tagen". Ich habe es korrigiert (bereits das obige Bild), indem ich die Höhen für die Kopf- und Fußzeile jedes Abschnitts überschreibe.
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
return section == kMoreInfoSection ? 33 : UITableViewAutomaticDimension;
}
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
{
return UITableViewAutomaticDimension;
}
Ich habe gelernt, die Höhen von @ erurainons Kommentar in der akzeptierten Antwort zu überschreiben, und UITableViewAutomaticDimension
von https://stackoverflow.com/a/14404104/855680 . Ich musste self.automaticallyAdjustsScrollViewInsets
in meinem View-Controller nicht auf NO
setzen, anders als die akzeptierte Antwort vermuten lässt.
Ich habe auch bereits versucht, die Variable UIEdgeInsets
einzustellen und der Tabellenansicht einen negativen Wert für die oberste zu geben, aber es hat nicht funktioniert - die gesamte Tabellenansicht wird nach oben verschoben, einschließlich der Variablen tableHeaderView
.
Stellen Sie sicher, dass Sie der Tabelle Einschränkungen gegeben haben. Ich hatte nicht das gleiche Problem und hatte eine unerklärliche Polsterung am unteren Rand des Tisches.
Ich ging alle Antworten durch. Keiner hat für mich gearbeitet. Alles was ich tun musste war:
self.myTableView.rowHeight = UITableViewAutomaticDimension
self.myTableView.estimatedRowHeight = 44.0
Darüber hinaus trat das Problem nicht oben in tableView auf. Dies geschah am oberen Rand jedes Abschnitts der tableView.
FWIW dieses Problem trat nur für iOS9 auf. Unsere App funktionierte gut für iOS10 und iOS 11.
Ich empfehle Ihnen dringend, diese großartige Frage und ihre besten Antworten zu sehen:
In meinem Fall gab es eine unerwünschte Zelle namens "HeaderView" für die Prototyp-Visualisierung in Storyboard, als ich sie löschte, war alles gut.
wenn self.automaticallyAdjustsScrollViewInsets = NO;
für Sie nicht funktioniert, stellen Sie sicher, dass die Höhe der Tabellenansichts- oder Abschnittsüberschrift CGFLOAT_MIN
nicht 0
ist.
Wenn Sie beispielsweise den Tabellenansichts-Header auf 0 setzen möchten, können Sie Folgendes tun:
CGRect frame = self.tableViewHeader.frame;
frame.size.height = CGFLOAT_MIN; //not 0
self.tableView.tableHeaderView.frame = frame;
self.tableView.tableHeaderView = self.tableViewHeader;
Ich hoffe es hilft.
Swift3
If you are using grouped table then do following things .
This will remove top space.
var frame = CGRect.zero
frame.size.height = .leastNormalMagnitude
self.tableView.tableHeaderView = UIView(frame: frame)
self.tableView.tableFooterView = UIView(frame: frame)
If you Still getting this issue then it will remove by default content offset from top.
[Set content insets never]
Schließlich überlegte ich, wie man das Problem beheben kann, nachdem man alles versucht hat!
Ich habe festgestellt, dass das contentOffset meines tableview aus irgendeinem Grund ein 'y' von -20 hatte, also bei der Konfiguration meines tableview: Swift 3/4
tableView.contentOffset = .zero
Ziel c
self.tableView.contentOffset = CGPointMake(0, 44);
Swift 4 antworte ...
Wenn die Tabellenansicht im Interface Builder ausgewählt ist und im Attributinspektor der Stil "Gruppiert" ausgewählt ist, geben Sie den folgenden Code in Ihren View Controller ein, um das Problem mit dem zusätzlichen Header-Speicherplatz zu beheben.
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return CGFloat.leastNonzeroMagnitude
}
Verwenden von Swift 4.1. Versuche dies:
func tableView(_ tableView: UITableView, viewForHeaderInSection
section: Int) -> UIView? {
return nil
}
in iOS 7 beginnt die Ansicht am Bildschirm anstatt unterhalb der Navigationsleiste. Es ist sehr einfach, das auf den unteren Rand der Navbar zu setzen. Überprüfen Sie DIESE Antwort auf die Lösung, es ist nicht die gleiche Frage, aber sehr auf Ihre bezogen.
Keine der Antworten oder Umgehungen haben mir geholfen. Die meisten beschäftigten sich mit der tableView selbst. Was das Problem für mich verursachte, war die Ansicht, zu der ich die tableView oder collectionView hinzufügte. Das hat es für mich behoben:
Swift 5
edgesForExtendedLayout = []
Ich habe das in mein viewDidLoad eingefügt und die nervige Lücke ist verschwunden. Hoffe das hilft.
Noch eine andere Art, es zu tun ... aber ich mag es, weil es den Hardcoding von Höhenwerten vermeidet .
Weisen Sie in einer UITableViewStyleGrouped
-Tabelle (statisch oder dynamisch) einfach die gewünschte Höhe in tableView(_:heightForHeaderInSection)
zu. Ich berechne die neue Höhe basierend auf der unteren Auffüllung für die Beschriftung der Abschnittskopfzeile.
override func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
var height = UITableViewAutomaticDimension
if section == 0, let header = tableView.headerViewForSection(section) {
if let label = header.textLabel {
// get padding below label
let bottomPadding = header.frame.height - label.frame.Origin.y - label.frame.height
// use it as top padding
height = label.frame.height + (2 * bottomPadding)
}
}
return height
}
Getestet auf iOS 9, Xcode 7.3.
Ich hoffe es hilft.
Dieser Code hat für mich funktioniert. Die beste Antwort für mich, die oben in objective-C
geschrieben wurde, 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 Champion funktionieren.
Keine der vorherigen Antworten funktionierte für mich. Was für meine Situation funktionierte (was darin zu sehen war, dass das Auffüllen nach dem dynamischen Hinzufügen eines Headers zu meinem Table View
) war, war das Navigation Bar
aus dem Document Outline
auszuwählen und das Kästchen Translucent
erneut zu überprüfen (im Gegensatz zu einigen Antworten, die erzwingen, dass es durchsichtig ist) . Ich hatte es vorher deaktiviert, weil es mein rotes Aussehen ein wenig orange gefärbt hatte, aber ich konnte nicht versuchen, die Elemente in der Szene neu zu ordnen, da Table View
das einzige Element in dieser Szene war. Diese Lösung funktioniert, solange Sie mit der Farbe von Navigation Bar
eine transparente Schicht darüber haben. Hoffe das hilft :)
Für mich habe ich alle Lösungen ausprobiert, aber ich habe darüber nachgedacht, die Höhe für den UITableView-Abschnitt festzulegen, und das funktioniert für mich. (Mit Swift )
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return 0.001
}
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return 0.0
}
Das hat bei mir funktioniert. Man kann auch die Höhe für den Header angeben, basierend auf dem Abschnitt.