Entfernen Sie den leeren Bereich vor den Zellen in UITableView


171

Ich versuche derzeit, eine UITableViewan einem anderen Ort als oben auf meinem View Controller zu platzieren. Vor diesem Hintergrund wird versucht, den Header oben hinzuzufügen, um die Navigationsleiste zu berücksichtigen. Dies wird jedoch nicht benötigt, da ich ihn nicht oben auf meinem Controller habe.

Wenn ich die obere linke Ecke der Stelle platziere, an der sich UITableViewdie Zellen befinden sollen, werden die Zellen dort nicht platziert:

Wenn ich jetzt nur die Tabellenansicht nach oben verschiebe, damit sich die Zellen an der richtigen Stelle befinden, tritt ein anderes Problem auf: Die Zellen können beim Scrollen nach oben verschoben werden (dies ist mit meinem Finger über dem Navigationscontroller):

Wenn ich loslasse, ja - die Zellen werden direkt unter der Suchleiste angezeigt, aber dies ist offensichtlich ein Problem, wie Sie sie darüber bringen können.

Wie würde ich das machen? Gibt es einen einfacheren Weg?

Antworten:


378

UITableViewZeigen sich die Zellen der Show auf dem leeren Raum, wenn Sie nach unten scrollen?

Wenn ja, dann könnte das Problem der Einschub sein, der dem hinzugefügt wird UITableView aufgrund des Navigationscontrollers, den Sie in Ihrer Ansicht haben . Der Einschub wird der Tabellenansicht hinzugefügt, damit der Inhalt unter der Navigationsleiste platziert wird, wenn kein Bildlauf stattgefunden hat. Wenn die Tabelle gescrollt wird, wird der Inhalt gescrollt und unter einer transparenten Navigationsleiste angezeigt. Dieses Verhalten ist natürlich nur erwünscht, wenn die Tabellenansicht direkt unter der Navigationsleiste startet, was hier nicht der Fall ist.

Eine andere zu beachtende Sache ist, dass iOS den Inhaltseinsatz nur für die erste Ansicht in der Ansichtshierarchie anpasst, wenn es sich um UIScrollVieweinen Nachkommen handelt (z . B. UITableViewund UICollectionView). Wenn Ihre Ansichtshierarchie mehrere Bildlaufansichten enthält, automaticallyAdjustsScrollViewInsetswerden nur Anpassungen an der ersten vorgenommen.

So ändern Sie dieses Verhalten:

a) Interface Builder

  • Wählen Sie den View Controller
  • Öffnen Sie den Attributinspektor
  • Im Attributinspektor von IB (wenn ein Ansichtscontroller ausgewählt ist) gibt es eine Eigenschaft namens "Bildlaufansichten anpassen", die standardmäßig aktiviert ist. Deaktivieren Sie diese Option:


    (Mit freundlicher Genehmigung von Dheeraj D )

Ich bin nicht sicher, welche Xcode-Version diese Option eingeführt hat (habe sie in den Versionshinweisen nicht gefunden), aber sie ist zumindest in Version 5.1.1 verfügbar.

Bearbeiten: Um Verwirrung zu vermeiden, war dies die dritte Option, die in den Kommentaren erwähnt wurde

b) Programmatisch

Fügen Sie dies hinzu, dh viewDidLoad(Credits zu Slavco Petkovskis Antwort und Cris Rs Kommentar)

// Objective-C
self.automaticallyAdjustsScrollViewInsets = NO;

// Swift
self.automaticallyAdjustsScrollViewInsets = false

c) Dies könnte für alte Schüler relevant sein

Sie können dies entweder durch Hinzufügen beheben

tableView.contentInset = UIEdgeInsetsZero

//Swift 3 Change
tableView.contentInset = UIEdgeInsets.zero

Oder wenn Sie IB verwenden und die Navigationsleiste nicht transparent ist (kann dem Screenshot nicht entnehmen)

  • Wählen Sie den View Controller
  • Öffnen Sie den Attributinspektor
  • Deaktivieren Sie in den View Controller-Optionen "Kanten erweitern" die Option "Unter den oberen Balken".

2
Das Abwählen von "Under Top Bars" in der UIView hat für mich gut funktioniert. Vielen Dank.
Andreas Øverland

Ich war verrückt nach "Paging Enabled" und dem Bildlauf, der sich nur um die Höhe der Navigationsleiste anstatt um die gesamte Zelle verschob. Vielen Dank.
LordParsley

8
Die dritte Option: Deaktivieren Sie "Bildlaufansichten anpassen" - hat wie ein Zauber funktioniert. danke lekksi!
Stas Zhukovskiy

2
self.automaticallyAdjustsScrollViewInsets = false in Swift arbeitet "de pelos"!
Cris R

1
Dank der Einstellung UIEdgeInsetsZero ist erforderlich, wenn eine Tabelle in einem neuen Tabellencontroller jedes Mal wiederverwendet wird, wenn sie angezeigt wird. Andernfalls wird dieselbe weiße Lücke angezeigt und wird immer größer.
Malhal

70

Ich hatte das gleiche Problem und bin mir ziemlich sicher, dass ich irgendwann eine UIView hatte. Durch einfaches Kopieren der gesamten Tabellenansicht, Löschen und erneutes Einfügen wurde das Problem für mich behoben.


7
das ist wirklich sehr, sehr seltsam. Dies löste das Problem. Irgendeine Idee, wann dies passiert?
MiQUEL

Ich denke, Sie können es viel einfacher lösen, indem Sie meiner Antwort vom 10. Oktober 13
netshark1000

Hatte das gleiche Problem. Das Entfernen und Lesen hat auch bei mir funktioniert.
Sma

3
Soweit ich weiß, werden Inhaltseinfügungen für die Bildlaufansicht nur dann automatisch angepasst (wenn automatischAnjustsScrollViewInsets = YES ist, was standardmäßig der Fall ist), wenn die Bildlaufansicht das erste untergeordnete Element in der Ansichtshierarchie der Ansichtssteuerung ist. Ich vermute, dass diese Lösung funktioniert, da sie nach dem Einfügen der Tabellenansicht nicht mehr die erste Ansicht in der Ansichtshierarchie ist.
Lekksi

Wenn die tableView das erste ist, was Sie der Ansicht hinzufügen, denkt das System, dass es Platz für die Navigation lassen muss. Ich vermute hier, dass einige Leute die tableView und dann die headerView hinzufügen. Nach einigen Problemen entfernen sie dann die tableView und fügen sie erneut hinzu. Dann passiert die headerView als erstes in der Hierarchie, sodass sich das System nicht mehr anpassen muss, das Problem ist gelöst. Ich weiß, weil ich nur Code verwende, also musste ich in meinem Fall zuerst den Header und dann die Tabelle hinzufügen, um das Problem zu beheben.
Lluis Gerard

40

Wählen Sie die Tabellenansicht in Ihrem Storyboard aus und stellen Sie sicher, dass der Stil auf "Einfach" anstatt auf "Gruppiert" eingestellt ist. Sie finden diese Einstellung auf der Registerkarte Attribute Inspector.


erstaunlich .. das war die Lösung für mich seltsam .. Ich habe nur den gesamten View Controller kopiert und eingefügt, aber irgendwie hatte die tableView dieses eingefügten View Controllers diesen seltsamen Offset. Diese Antwort löste mein Problem
daisura99

Dies löste das Problem, aber jetzt verhalten sich Header-Abschnitte anders. Jemand?
Bruno Muniz

Gesundheit. Wo immer du auf dieser Welt bist. Segne dich für immer.
Gabuchan

9

In meinem Fall hatte ich ein UILabel unter der UITableView in der Ansichtshierarchie.

Ich bewegte es "vorwärts" und die Leerstelle erschien. Ich weiß nicht warum, aber es funktioniert so. Wenn sich unter der tableView etwas befindet, wird die Leerstelle ausgeblendet.

Sie können auch versuchen, "Scroll View Insets" in Ihrem View Controller Inspector im Storyboard zu aktivieren / deaktivieren.

Geben Sie hier die Bildbeschreibung ein


2
Ich habe eine gruppierte UITableView und das Deaktivieren von "Scroll View Insets anpassen" funktioniert.
Matt

5

Keiner der oben genannten hat mir geholfen. aber das hat geholfen :

self.tableView.contentInset = UIEdgeInsetsMake(-64, 0, 0, 0)

Anstelle von '-64' können Sie abhängig von der Höhe Ihrer Navigationsleiste eine beliebige andere Zahl eingeben.


4

Es kann vorab hinzugefügt werden UIRefreshControl. Ich habe dieses Problem mit Code wie folgt:

self.refreshControl = [[UIRefreshControl alloc] init];{
    [self.refreshControl setAttributedTitle:[[NSAttributedString alloc]
                                             initWithString:@"Your string"]];
    [self.refreshControl addTarget:self
                            action:@selector(updateScreen)
                  forControlEvents:UIControlEventValueChanged];

}

Wie Sie sehen, setze ich self.refreshController sofort danachinit

Wenn Sie jedoch refreshControlnach dem Setup festlegen , stört Sie der Top-Space nicht.

UIRefreshControl *refreshControl  = [[UIRefreshControl alloc] init];{
    [self.refreshControl setAttributedTitle:[[NSAttributedString alloc]
                                             initWithString:@"Your String"]];
    [self.refreshControl addTarget:self
                            action:@selector(updateScreen)
                  forControlEvents:UIControlEventValueChanged];
    self.refreshControl = refreshControl;
}

Ich kann nicht glauben, dass dies das eigentliche Problem war. Es ist nur ein Problem für mich am <= 9.3.5. Wie um alles in der Welt haben Sie das herausgefunden?
Sirenen

4

Wenn Sie dies unter iOS 11 tun, funktioniert "AdjustsScrollViewInsets" automatisch nicht, da es veraltet ist. Der folgende Code hat für mich gemäß der Antwort in diesem Beitrag funktioniert: https://stackoverflow.com/a/44391269/5476481

        if #available(iOS 11.0, *) {
            tblView.contentInsetAdjustmentBehavior = .never
        } else {
            automaticallyAdjustsScrollViewInsets = false
        }

Hoffe das hilft.


4

Setzen contentInsetsSie im Storyboard die Option " Nie"tableview auf " Nie"

Geben Sie hier die Bildbeschreibung ein


3

Ich kann nicht sicher sagen, aber es sieht so aus, als ob zwischen dem Beginn der Prototypzellen und dem oberen Rand der UITableView ein zusätzliches UIView steckt. Mein Bild sieht genauso aus wie deins, wenn Sie den Text / die Zeilen entfernen, die ich hinzugefügt habe.

Geben Sie hier die Bildbeschreibung ein


3

Ich bin mir immer noch nicht sicher, was diesen zusätzlichen Speicherplatz oben verursacht hat, aber ich habe festgestellt, dass das Löschen der UITableView durch den Speicherplatz und das Ersetzen durch einen neuen Speicherplatz den Speicherplatz weggenommen hat.

Ich muss versehentlich eine UIView hineingezogen haben, aber ich konnte sie nicht auswählen, sodass ich sie nicht löschen konnte.


3

Swift 5

Versuchen Sie es mit tableHeaderView und tableFooterView

var frame = CGRect.zero
frame.size.height = .leastNormalMagnitude
tblView.tableHeaderView = UIView(frame: frame)
tblView.tableFooterView = UIView(frame: frame)

2

Überprüfen Sie Ihren Tabellenansichtsrahmen im Storyboard oder in xib. Meins hat standardmäßig einen Positionswert, daher der Fehler


2

In meiner Bewerbung habe ich auch ein solches Problem festgestellt. Ich habe den oberen Rand von tableView auf Null gesetzt. Auch versucht eingestellt falsefürautomaticallyAdjustsScrollViewInsets . Hat aber nicht funktioniert.

Endlich habe ich eine funktionierende Lösung. Ich weiß nicht, ob das der richtige Weg ist. Aber die Implementierung der heightForHeaderInSectionDelegate-Methode hat bei mir funktioniert. Sie müssen einen Wert ungleich Null zurückgeben, um dies zu erreichen (Rückgabe Null zeigt den gleichen Platz wie zuvor an).

override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {

    return 0.1
}

2

Was 2017 für mich funktioniert, ist einfach diese eine Zeile

navigationController? .navigationBar.isTranslucent = false

Ich habe keine Ahnung, warum sich das überhaupt darauf auswirken würde. Vielleicht könnte jemand erklären. Aber ich bin mir ziemlich sicher, dass dies die Antwort ist, nach der die meisten Menschen suchen würden.


Das hat es auch für mich getan. Vielen Dank!
Scurioni

2

In iOS 11 und höher hat Apple die Eigenschaft geändert, um das Einfügen von Inhalten anzupassen. Verwendung contentInsetAdjustmentBehaviorund stellt .neveroben zusätzlichen Raum zu entfernen UICollectionView, UIScrollView, UITableView.

if #available(iOS 11.0, *) {

    // For scroll view
    self.scrollView.contentInsetAdjustmentBehavior = .never

    // For collection view
    self.collectionView.contentInsetAdjustmentBehavior = .never

    // For table view
    self.tableView.contentInsetAdjustmentBehavior = .never

} else {
    self.automaticallyAdjustsScrollViewInsets = false
}

Ich hoffe, dies wird dir helfen.


1

Für mich trat das Problem auf, als ich eine Prototypzelle aus dem Menü in die Tabellenansicht zog. Also habe ich das gelöscht und die Prototypzelle in den Eigenschaften des Inspektors für die Tabellenansicht auf 1 gesetzt


1

Ich mache das programmgesteuert und habe einfach meine addSubview (tableView) nach unten verschoben, nachdem ich alle meine anderen Unteransichten hinzugefügt habe, und es hat mein Problem gelöst!

Ich bin mir nicht sicher, warum dies nur auf dem Gerät und nicht auf meinem Simulator angezeigt wird, aber so oder so gibt es zumindest eine einfache Lösung!


1

Solange UITableView nicht die erste Unteransicht des View Controllers ist, wird der leere Bereich nicht angezeigt.

Lösung: Fügen Sie ein ausgeblendetes / klares Ansichtsobjekt (Ansichten, Beschriftungen, Schaltflächen usw.) als erste Unteransicht des Ansichtscontrollers hinzu (auf derselben Ebene wie die UITableView, jedoch davor).


Ich habe so viel Zeit damit verbracht, dies herauszufinden und viele der Vorschläge hier und in anderen Posts auszuprobieren. Dies ist derjenige, der es gelöst hat. Danke dir! Können Sie erklären, warum oder einen Link zu einem Dokument veröffentlichen, das dies tut? Ich lerne gerade iOS-Entwickler und es ist so anders als Android! :)
Mark

0

UIView kann oben und unten in die Tabelle eingefügt werden (Drag & Drop). Stellen Sie ihre Eigenschaften als transparent und eine Höhe von 1 px ein. Dies dient dazu, die zusätzliche Polsterung vor den Zellen zu entfernen.


0

Ich hatte auch dieses Problem, dass die tableView nicht die letzte Ansicht in der Hierarchie war. In meinem Fall hatte ich eine Ansicht oben (obwohl sie sich nicht überlappten), also zog ich sie über die tableView in der Hierarchie und das machte es.


0

Ich habe gerade eine Lösung dafür gefunden.

Wählen Sie einfach Tabellenansicht und Clic-Editor -> Anordnen -> Nach vorne senden

Es hat bei mir funktioniert und ich hoffe, es hilft euch allen.


0

In meinem Fall habe ich ContainerViewController verwendet und UITableViewController eingefügt. Nach dem Entfernen von ContainerViewController. Probleme gehen weg.


0

Xcode 8 Fehler…

Versuchen Sie dies zuerst, wenn Ihr Storyboard UITableView-Stil auf "Einfach" eingestellt ist.

Setzen Sie den Stil der Tabelle auf Gruppiert und dann zurück auf Einfach. Dadurch wurde der Platz in meiner App am Kopf meiner UITableView entfernt.


0

In meinem Fall habe ich eine Containeransicht verwendet (Hauptansicht -> Contaner-Ansicht -> UITableView)

Der zusätzliche Platz oben entspricht meiner Meinung nach dem Platz in der Geräte-Benachrichtigungsleiste (wo die Uhrzeit angezeigt wird, der Akku). Das tue ich wirklich, das ist keine Annahme.

Was ich getan habe, war vom UI Builder:

  • Wählen Sie den Table View Controller abgeschlossen
  • Öffnen Sie den Attributinspektor
  • Gehen Sie zu -> View Controller -> Layout -> "Select Wants Full Screen".

0

Sie können diesen Code in viewDidLoad oder viewDidAppear verwenden, wo Ihre Tabelle erstellt wird:

// Remove blank space on header of table view
 videoListUITableView.contentInset = UIEdgeInsetsZero;

// The iOS device = iPhone or iPod Touch
CGSize iOSDeviceScreenSize = [[UIScreen mainScreen] bounds].size;

// Set the height of the table on the basis of number of rows
videoListUITableView.frame = CGRectMake(videoListUITableView.frame.origin.x, videoListUITableView.frame.origin.y, videoListUITableView.frame.size.width, iOSDeviceScreenSize.height-100);



// Hide those cell which doesn't contain any kind of data
self.videoListUITableView.tableFooterView = [[UIView alloc] init];


0

Legen Sie die erweiterten Kanten von ViewController im Storyboard so fest, dass die underTopBarEigenschaft deaktiviert ist.


0

Hatte das gleiche Problem. Ich habe es gelöst, indem ich viewDidLoad Folgendes hinzugefügt habe.

self.extendedLayoutIncludesOpaqueBars = true


-2

prüfen Auf

if ([tableView respondsToSelector:@selector(setSeparatorInset:)]) {
    [tableView setSeparatorInset:UIEdgeInsetsZero];
}
  • Erwähnen Sie die Tabellenansicht-Delegatenfunktion cellForRowAtIndexPath:
  • Es kann sowohl iOS 6 als auch 7 verarbeiten.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.