732 Stimmen

Warum gibt es zusätzlichen Abstand oben auf meiner UITableView mit dem Style UITableViewStyleGrouped in iOS7?

Ab iOS 7 gibt es zusätzlichen Platz oben auf meinen UITableView's, die den Style UITableViewStyleGrouped haben.

Hier ist ein Beispiel:

Bildbeschreibung hier eingeben

Die Tabelle beginnt beim ersten Pfeil, es gibt 35 Pixel unerklärlichen Abstand, dann ist der grüne Header eine UIView, die von viewForHeaderInSection zurückgegeben wird (wo die Sektion 0 ist).

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


Update (Antwort):

In iOS 11 und später:

tableView.contentInsetAdjustmentBehavior = .never

10voto

Ashish Pisey Punkte 1425

Dankeschön für die Antwort von @Aurelien Porte. Hier ist meine Lösung

Ursache dieses Problems:-

  1. Ein UITableView mag es nicht, eine Überschrift mit einer Höhe von 0,0 zu haben. Wenn Sie versuchen, eine Überschrift mit einer Höhe von 0 zu haben, können Sie zur Lösung springen.
  2. Sogar wenn Sie später Ihrer Überschrift eine Höhe ungleich 0,0 zuweisen, mag es ein UITableView nicht, zunächst eine Überschrift mit einer Höhe von 0,0 zugewiesen zu bekommen.

In ViewDidLoad:-

self.edgesForExtendedLayout = UIRectEdge.None

self.automaticallyAdjustsScrollViewInsets = false

Kein Bedarf für so etwas :-

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

Im heightForHeaderInSection Delegierten:-

if section == 0
    {
        return 1
    }
    else
    {
        return 40; // der Höhenwert Ihrer anderen Überschriften
    }

Im viewForHeaderInSection Delegierten :-

if section == 0 
{  
   // Hinweis: CGFloat.min für Swift
   // Für Objective-C CGFLOAT_MIN 
   let headerView = UIView.init(frame: CGRectMake(0.0, 0.0, self.myShaadiTableview.bounds.size.width, CGFloat.min)) 
   return headerView
}
else
{ 
   // Konstruieren Sie hier Ihre anderen Überschriften
}

9voto

Swift 4 Code: Für TableView ohne Abschnittsüberschriften können Sie diesen Code hinzufügen:

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

und Sie erhalten den Kopfabstand auf 0.

Wenn Sie einen Kopf mit Ihrer spezifischen Höhe wünschen, übergeben Sie diesen Wert:

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

und die Ansicht vom viewForHeaderinSection-Delegierten.

9voto

zvjerka24 Punkte 1742

Meine Antwort wird allgemeiner sein, aber kann auch auf dies angewendet werden.

Wenn die Root-Ansicht (des View Controllers) oder das erste untergeordnete Element (Subview) der Root-Ansicht eine Unterklasse des UIScrollView (oder UIScrollView selbst) ist, und wenn

self.navigationController.navigationBar.translucent = YES;

wird das Framework automatisch vorab berechnete Inhaltsabstände setzen.


Um dies zu vermeiden, kannst du das machen

self.automaticallyAdjustsScrollViewInsets = NO;

aber in meinem Fall konnte ich das nicht tun, weil ich ein SDK implementiert habe, das ein UIView-Komponente enthält, die von anderen Entwicklern verwendet werden kann. Diese UIView-Komponente enthält ein UIWebView (das UIScrollView als ersten Unterblick enthält). Wenn diese Komponente als erstes Kind in der View-Hierarchie des UIViewControllers hinzugefügt wird, werden automatische Abstände vom System angewendet.

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

In diesem Fall hat das System keine Unterklasse des UIScrollView als ersten Unterblick gefunden und keine Abstände angewendet.

9voto

Kevin Punkte 3071

Ich gehe davon aus, dass dies nur ein Teil des neuen UITableViewStyleGrouped Stylings ist. Es befindet sich in allen gruppierten Tabellenansichten und es scheint keinen direkten Weg zu geben, um diesen Raum zu kontrollieren.

Wenn dieser Raum durch eine UIView dargestellt wird, wäre es möglich, alle subviews der UITableView zu durchsuchen, um diese spezifische Ansicht zu finden und direkt zu bearbeiten. Es besteht jedoch auch die Möglichkeit, dass dieser Raum einfach ein festgelegter Versatz vor dem Beginn von Überschriften und Zellen ist, und es gibt keine Möglichkeit, ihn zu bearbeiten.

Um alle Subviews zu durchsuchen (Ich würde diesen Code ausführen, wenn die Tabelle keine Zellen hat, um die Ausgabe etwas leichter lesbar zu machen):

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

    // Holen Sie sich die Subviews der Ansicht
    NSArray *subviews = [view subviews];

    // Rückgabe, wenn keine Subviews vorhanden sind
    if ([subviews count] == 0) return;

    for (UIView *subview in subviews) {

        NSLog(@"%@", subview);

        // Liste die Subviews von Subview auf
        [self listSubviewsOfView:subview];
    }
}

7voto

Oded Punkte 895

Ich hatte dieselbe Lösung wie arielyz. Sobald ich das UITableView nicht als ersten Subview des Eltern-Views verschoben habe, ist es verschwunden. Mein Abstand betrug 20 px, nicht 35.

Ich konnte es nicht in einem Portrait-Xib reproduzieren, nur in einem Landschafts-Xib. Falls ich es in einer einfachen Demo-App reproduzieren kann, werde ich später einen Radar-Bug einreichen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X