web-dev-qa-db-de.com

Warum wird oben in UITableView eine zusätzliche Auffüllung mit dem Stil UITableViewStyleGrouped in iOS7 verwendet?

Ab iOS7 gibt es am oberen Rand meiner UITableView zusätzlichen Speicherplatz, der einen Stil UITableViewStyleGrouped hat. 

Hier ist ein Beispiel:

enter image description here

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? 

587
esilver

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. 

52
esilver

Mir wurde folgendes geholfen:

YouStoryboard.storyboard> YouViewController> Eigenschafteninspektor> Deaktivieren - Anpassen der Bildlaufansichten.

 enter image description here

852
Alexander

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. 

296
Mr. T

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)
174
yeahdixon

Ä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

159
nvrtd frst
self.automaticallyAdjustsScrollViewInsets = NO;

versuchen Sie, Sie können damit umgehen!

132
guanhuiwit

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
}
66
LightMan

Deaktivieren Sie "Anpassen der Bildlaufansichten".

 enter image description here

49
Tú Đt

Noch ein kurzer Kommentar ... selbst in XCode 6.1 gibt es einen Fehler mit vertikalen Leerzeichen am oberen Rand von UIScrollViews, UITextViews und UITableViews.

enter image description here

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.

enter image description here

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

45
Mike Gledhill

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. 

39
girish_vr

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);
37
Aqib Mumtaz

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:

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

  2. 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;
33
Aurelien Porte

Storyboard:

Deaktivieren Sie einfach: Adjust Scroll View Insets in den Optionen von View Controller

enter image description here

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
}
18
AndreasLukas

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;
}
14
Lukas

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))
14
sunshinejr

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

self.automaticallyAdjustsScrollViewInsets = NO;
14
judepereira

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

Ursache für dieses Problem: - 

  1. 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.
  2. auch wenn Sie später einer Kopfzeile eine Höhe von nicht 0.0 zuweisen, wird einer UITableView zunächst nicht gerne eine Kopfzeile mit einer Höhe von 0,0 zugewiesen.

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 
}
10
Ashish Pisey

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.

10
Vinod Joshi

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

9
zvjerka24

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];
    }
}
8
Kevin

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 

8
Pink Panther

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.

7
Jiangfan Du

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.

7
Oded
override func viewWillAppear(animated: Bool) {
        self.edgesForExtendedLayout = UIRectEdge.None

 //  OR

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

   //OR

 self.automaticallyAdjustsScrollViewInsets = false
        }
6
A.G

Um tableviewHeader-Platz von top zu entfernen, habe ich folgende Änderungen vorgenommen:

YouStoryboard.storyboard> YouViewController> TableView auswählen> Größeninspektor> Inhaltseinsätze - Legen Sie "niemals" fest.

 enter image description here

6
user832

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))
6
Danut Pralea

verwenden Sie dieses Ich denke, diese Hilfe ...

 - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
 {
    return 0.005f;// set this according to that you want...
 }
6
-(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)];
5
Hari c

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

4
arielyz

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.

4
latenitecoder
tableView.contentInsetAdjustmentBehavior = .never

war die Lösung für mich (iOS12/xcode 10) auf einem einfachen Tableview mit Kopfzeilen

3
david

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.

3
Yevhen Dubinin

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.

3
LorikMalorik

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;
}
3
FFur

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

2
konsti

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.

2

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

2
Aks

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:

  • deaktivieren Sie die Option zum automatischen Anpassen der Bildlaufeinstellungen
  • deaktivieren Sie die Option zum Erweitern der Kanten unter der oberen Leiste

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:

  • hält den Tisch nach oben gezogen, aber direkt unter meiner Navigationsleiste
  • nach dem Aktualisieren kehrt die Tabelle an diese Position zurück und nicht unter der Navigationsleiste
  • nach dem Scrollen der Tabellenböden am tatsächlichen unteren Rand, nicht zu kurz

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

2
the_dude_abides

Ich bin nicht sicher, ob dies eine gute Antwort ist, aber es funktioniert bei mir

Ich wähle die Tabellenansicht, navigiere zum Lineal und ändere den Y-Wert in Null 

 enter image description here

1
Mina Fawzy

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:

enter image description here

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.

1
Matthew Quiros

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.

1
Yash Tamakuwala

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: 

Verwenden des automatischen Layouts in UITableView für dynamische Zellenlayouts und variable Zeilenhöhen

1
Honey

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.

1
Robert Juz

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.

0
coolbeet

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]          

https://i.stack.imgur.com/fjxOV.png

0

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);
0
Jason Silver

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
}
0
F. Morales

Verwenden von Swift 4.1. Versuche dies: 

func tableView(_ tableView: UITableView, viewForHeaderInSection 
section: Int) -> UIView? {
    return nil 
}
0
ali ziwa

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.

0
MQoder

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.

0
c0d3p03t

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.

0
maganap

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.

0
Vipul Kumar

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

0
jeff t

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
    }
0
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.

0
vsujan