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?

Hetelek
quelle

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

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

netshark1000
quelle
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

Andre Cytryn
quelle
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.

Tung Fam
quelle
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;
}
akaDuality
quelle
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.

Jacobo Koenig
quelle
4

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

Geben Sie hier die Bildbeschreibung ein

Marwen Doukh
quelle
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

Mike S.
quelle
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.

Hetelek
quelle
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)
Vivek
quelle
2

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

Arthi
quelle
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
}
Anusha Kottiyal
quelle
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.

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

Mayur Karmur
quelle
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

Junaid Ahmed
quelle
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!

Austin Whitelaw
quelle
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).

jr.ong
quelle
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.

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

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

Daniel Meza
quelle
0

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

Sandeep Ahuja
quelle
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.

Carl
quelle
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".
Patricio Diego
quelle
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];
Vinod Joshi
quelle
0

I just found a solution for this. In my case, i was using TabBarViewController, A just uncheck the option 'Adjust Scroll View Insets'. Issues goes away. https://i.stack.imgur.com/vRNfV.png

NitinLandge
quelle
0

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

JAHelia
quelle
0

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

self.extendedLayoutIncludesOpaqueBars = true
Jose Carrillo
quelle
-1

Setzen Sie die Inhaltseinfügungen auf Null:

Sriram Neelamegam
quelle
-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.
Manikandan
quelle