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

12voto

Fattie Punkte 34702

Antwort 2022:

Du musst einfach das hier tun

tableView.contentInsetAdjustmentBehavior = .never

was nicht dokumentiert ist

Seltsame subtile Besonderheit ->

Tableviews haben heutzutage ein sehr eigenartiges Verhalten:

  1. Auf Geräten mit einer Kerbe (XR, etc) wird ohne es dir zu sagen mehr Einrückung hinzugefügt ABER NUR WENN die Tabelle am physischen oberen Rand des Bildschirms startet.

  2. Wenn du NICHT am oberen Rand des Bildschirms startest, wird es das nicht tun, aber

  3. Beide Fälle sind >> nicht verwandt << zu safeAreaInsets ....... was sehr verwirrend ist

All das ist völlig undokumentiert ... du kannst Stunden damit verschwenden, das herauszufinden.

Wenn du tatsächlich möchtest, dass deine Messungen tatsächlich vom oberen Rand des Bildschirms/Tisches aus starten,

dann gehe einfach:

tableView.contentInsetAdjustmentBehavior = .never

Ein gutes Beispiel ist natürlich, wenn du irgendeine Art von Banner oder ähnlicher Elemente über den oberen Teil einer Tabelle hinzufügst, was heutzutage üblich ist, und du einfach die obere Einrückung der Tabelle auf die Höhe einstellst, die dein Banner/etc hat, wenn es läuft.

Um das zu tun, musst du den

tableView.contentInsetAdjustmentBehavior = .never

Aufruf verwenden :/

Bonus Besonderheit

Vergiss nicht, dass heutzutage fast immer Informationen (Benutzerbilder, Beschreibungen, etc.) dynamisch geladen werden, sodass du solche Werte nicht auf den endgültig benötigten Wert setzen kannst, bis die Informationen ankommen. Ein weiterer Hinweis. :/

Du hättest also Code wie:

func setTableOffsetOnceFlagAreaSizeIsKnown() {
    tableView.contentInset.top = yourSpecialFlagViewUpTop.bounds.height
}

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    setTableOffsetOnceFlagAreaSizeIsKnown()
}

11voto

user832 Punkte 796

Um genau zu sein, um den TableViewHeader-Abstand oben zu entfernen, habe ich diese Änderungen vorgenommen:

YouStoryboard.storyboard > YouViewController > Wählen Sie TableView > Größeninspektor > Inhaltseinsätze - Setzen Sie sie auf nie.

Bildbeschreibung hier eingeben

11voto

Vinod Joshi Punkte 7388

Swift: iOS Ich hatte eine TableView auf einem ScrollView.. als ich auf demselben Bildschirm auf "Zurück" geklickt habe, hat der ScrollView oben mehr Platz eingenommen.. um dies zu lösen, habe ich verwendet:

 self.automaticallyAdjustsScrollViewInsets = false

Ein boolescher Wert, der angibt, ob das View-Controller automatisch seine ScrollView-Einsätze anpassen soll. Standardwert ist true, was es dem View-Controller ermöglicht, seine ScrollView-Einsätze in Reaktion auf die Bildschirmbereiche anzupassen, die von der Statusleiste, der Navigationsleiste und der Symbolleiste oder Tab-Leiste belegt werden. Setzen Sie es auf false, wenn Sie die Anpassung der ScrollView-Einsätze selbst verwalten möchten, z.B. wenn es mehr als einen ScrollView in der View-Hierarchie gibt.

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
}

10voto

Dani Punkte 4571

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

Swift:

tableView.sectionHeaderHeight = 0
tableView.sectionFooterHeight = 0

Objective-C:

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

Außerdem hatte ich immer noch einen zusätzlichen Platz für die erste Sektion. Das lag daran, dass ich die tableHeaderView Eigenschaft falsch verwendet habe. Habe das auch behoben, indem ich Folgendes hinzugefügt habe:

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

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