Gibt es eine Möglichkeit, den Abstand zwischen hinzuzufügen UITableViewCell
?
Ich habe eine Tabelle erstellt und jede Zelle enthält nur ein Bild. Das Bild wird der Zelle wie folgt zugewiesen:
cell.imageView.image = [myImages objectAtIndex:indexPath.row];
Dadurch wird das Bild jedoch vergrößert und passt in die gesamte Zelle, und es gibt keinen Abstand zwischen den Bildern.
Oder sagen wir auf diese Weise, die Bildhöhe beträgt zB 50, und ich möchte 20 Abstände zwischen den Bildern hinzufügen. Gibt es eine Möglichkeit, dies zu erreichen?
ios
objective-c
uitableview
saili
quelle
quelle
Antworten:
Schnelle Version
Aktualisiert für Swift 3
Diese Antwort ist für zukünftige Zuschauer etwas allgemeiner als die ursprüngliche Frage. Es ist ein ergänzendes Beispiel zum grundlegenden UITableView-Beispiel für Swift .
Überblick
Die Grundidee besteht darin, für jedes Array-Element einen neuen Abschnitt (anstelle einer neuen Zeile) zu erstellen. Die Abschnitte können dann unter Verwendung der Abschnittskopfhöhe beabstandet werden.
Wie es geht
Richten Sie Ihr Projekt wie im UITableView-Beispiel für Swift beschrieben ein . (Fügen Sie also a hinzu
UITableView
und schließen Sie dietableView
Steckdose an den View Controller an.)Ändern Sie im Interface Builder die Hintergrundfarbe der Hauptansicht in hellblau und die
UITableView
Hintergrundfarbe in klar.Ersetzen Sie den Code ViewController.swift durch den folgenden.
ViewController.swift
Beachten Sie, dass
indexPath.section
eher verwendet wird alsindexPath.row
wird, um die richtigen Werte für die Array-Elemente und Tap-Positionen zu erhalten.Wie haben Sie die zusätzliche Polsterung / den zusätzlichen Platz rechts und links erhalten?
Ich habe es genauso verstanden, wie Sie jeder Ansicht einen Abstand hinzufügen. Ich habe Einschränkungen für das automatische Layout verwendet. Verwenden Sie einfach das Stiftwerkzeug im Interface Builder, um Abstände für die führenden und nachfolgenden Einschränkungen hinzuzufügen.
quelle
numberOfSectionsInTableView
undreturn 1
für die Anzahl der Zeilen hinzufügen . Verwenden Sie dannindexPath.section
, um den aktuellen Zellenindex abzurufen. Versuchen Sie es einmal. Ich denke, Sie werden feststellen, dass Sie nicht sehr viele Änderungen an Ihrem aktuellen Setup vornehmen müssen. Dies ist definitiv einfacher als Unterklassen.layer
Manipulationen ziemlich schnell sind. Sagen Sie das, weil Sie einen Leistungseinbruch bemerkt haben oder als allgemeine bewährte Methode? Selbst wenn Sie sie in einer XIB festlegen, müssen sie beim Erstellen der Zelle festgelegt werden.Meine einfache Lösung mit Swift :
Ergebnis
quelle
super.layoutSubviews()
zuerst anrufen, um sicherzustellen, dass die gesamte Ansicht richtig angelegt war, bevor der Rahmen festgelegt wurde.didSet
fürselected
Variable überschreiben undlayoutSubviews()
innen aufrufen !Die Art und Weise, wie ich einen Abstand zwischen Zellen hinzufüge, besteht darin, numberOfSections = "Your array count" zu machen und dafür zu sorgen, dass jeder Abschnitt nur eine Zeile enthält. Und dann definieren Sie headerView und seine Höhe.
quelle
Ich musste das gleiche Konzept machen, dass UITableCells einen "Raum" zwischen sich haben. Da Sie nicht buchstäblich Leerzeichen zwischen Zellen hinzufügen können, können Sie diese fälschen, indem Sie die Zellenhöhe von UITableView ändern und dann der contentView Ihrer Zelle eine UIView hinzufügen. Hier ist ein Screenshot eines Prototyps, den ich in einem anderen Testprojekt gemacht habe, als ich dies simuliert habe:
Hier ist ein Code (Hinweis: Zu Demonstrationszwecken gibt es viele fest codierte Werte)
Zuerst musste ich das einstellen
heightForRowAtIndexPath
, um unterschiedliche Höhen in der UITableViewCell zuzulassen.Als nächstes möchte ich das Erscheinungsbild der UITableViewCells ändern, damit ich dies in der
willDisplayCell:(NewsUITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
Methode mache .Beachten Sie, dass ich meine whiteRoundedCornerView-Höhe 70.0 festgelegt habe und dies den simulierten Speicherplatz verursacht, da die Höhe der Zelle tatsächlich 80.0 beträgt, meine contentView jedoch 70.0, wodurch sie angezeigt wird.
Es gibt vielleicht andere Möglichkeiten, dies noch besser zu erreichen, aber so habe ich es gefunden. Ich hoffe es kann jemand anderem helfen.
quelle
Sie müssen den Rahmen für Ihr Bild festlegen. Ungetesteter Code ist
quelle
layoutSubviews
UITableViewCell
UITableViewCell
, um das gewünschte Ergebnis zu erzielen :) ... UnterklassenUITableViewCell
sind sehr verbreitet.UITableViewCell
. Wenn Sie benutzerdefinierte erstellenUITableViewCells
, sollten Sie Unterklassen seinUITableViewCell
.Ich war im selben Boot. Zuerst habe ich versucht, zu Abschnitten zu wechseln, aber in meinem Fall waren es eher Kopfschmerzen als ursprünglich gedacht, also habe ich nach einer Alternative gesucht. Um weiterhin Zeilen zu verwenden (und nicht mit dem Zugriff auf Ihre Modelldaten herumzuspielen), hat Folgendes für mich funktioniert, indem ich nur eine Maske verwendet habe :
Alles, was Sie noch tun müssen, ist , die Höhe der Zelle um den gleichen Wert wie gewünscht zu vergrößern
verticalPadding
und dann Ihr inneres Layout so zu ändern, dass alle Ansichten, die einen Abstand zu den Rändern der Zelle hatten, denselben Abstand um erhöhenverticalPadding/2
.verticalPadding/2
Kleiner Nachteil: Sie erhalten sowohl oben als auch unten in der Tabellenansicht eine Auffüllung, die Sie jedoch schnell beheben können, indem SietableView.contentInset.bottom = -verticalPadding/2
und einstellentableView.contentInset.top = -verticalPadding/2
. Hoffe das hilft jemandem!quelle
Ich denke, die einfachste Lösung, wenn Sie nur ein wenig Platz suchen und wahrscheinlich am billigsten sind, besteht darin, einfach die Farbe des Zellenrahmens auf die Hintergrundfarbe Ihrer Tabelle einzustellen und dann die Rahmenbreite festzulegen, um das gewünschte Ergebnis zu erzielen!
quelle
Wenn Sie noch keine Abschnittsüberschriften (oder -fußzeilen) verwenden, können Sie damit Tabellenzellen einen beliebigen Abstand hinzufügen. Anstatt einen Abschnitt mit n Zeilen zu haben, erstellen Sie eine Tabelle mit n Abschnitten mit jeweils einer Zeile.
Implementieren Sie die
tableView:heightForHeaderInSection:
Methode zur Steuerung des Abstands.Möglicherweise möchten Sie auch implementieren, um
tableView:viewForHeaderInSection:
zu steuern, wie der Abstand aussieht.quelle
Ich habe es so in Swift 4 gelöst.
Ich erstelle eine Erweiterung von UITableViewCell und füge diesen Code hinzu:
Ich hoffe es hilft dir.
quelle
Beispiel in Swift 3 ..
Der Controller-Code ist wie folgt
func numberOfSections (in tableView: UITableView) -> Int {return arraytable.count}
Laden Sie die vollständige Quelle auf Github herunter: Link
https://github.com/enamul95/CustomSectionTable
quelle
Drei Ansätze, die ich mir vorstellen kann:
Erstellen Sie eine benutzerdefinierte Tabellenzelle, in der die Ansicht der gesamten Zelle in der von Ihnen gewünschten Weise dargestellt wird
Anstatt das Bild zur Bildansicht hinzuzufügen, löschen Sie die Unteransichten der Bildansicht, erstellen Sie eine benutzerdefinierte Ansicht, die eine UIImageView für das Bild und eine andere Ansicht hinzufügt, möglicherweise eine einfache UIView, die den gewünschten Abstand bereitstellt, und fügen Sie sie als Unteransicht von hinzu die Bildansicht.
Ist das sinnvoll?
quelle
Ja, Sie können den Abstand (Auffüllen) zwischen zwei Zellen vergrößern oder verkleinern, indem Sie eine Basisansicht für die Inhaltsansicht in der Zelle erstellen. Stellen Sie eine klare Farbe für den Hintergrund der Inhaltsansicht ein und passen Sie die Höhe der Basisansicht an, um Platz zwischen den Zellen zu schaffen.
quelle
Basierend auf Husams Antwort: Wenn Sie die Zellebene anstelle der Inhaltsansicht verwenden, können Sie bei Bedarf einen Rahmen um die gesamte Zelle und das Zubehör hinzufügen. Diese Methode erfordert eine sorgfältige Anpassung der unteren Einschränkungen der Zelle sowie der Einfügungen, da sonst die Ansicht nicht richtig ist.
quelle
Ändern Sie die Anzahl der Zeilen im Abschnitt auf 1. Sie haben die Anzahl der Abschnitte anstelle der Anzahl der Zeilen geändert
Hier setzen Sie den Abstand zwischen den Zeilen
quelle
Ich denke, das ist die sauberste Lösung:
quelle
layoutMargins
dieser Anwendung konnte ich keine visuelle Veränderung feststellen . Vielleicht, weil ich Autolayout verwende.Dieser Artikel hat geholfen, es ist ziemlich genau das, was die anderen Antworten sagten, aber zusammengefasst und prägnant
https://medium.com/@andersongusmao/left-and-right-margins-on-uitableviewcell-595f0ba5f5e6
Darin wendet er sie nur auf die linke und rechte Seite an, aber der
UIEdgeInsetsMake
Init erlaubt das Hinzufügen von Polstern zu allen vier Punkten.Beachten Sie, dass UIEdgeInsets auch verwendet werden können, um dasselbe zu erreichen.
Xcode 9.3 / Swift 4
quelle
Die Verwendung einer Reihe verschiedener Abschnitte ist nicht erforderlich. Die anderen Antworten verwenden Frame-Insets und CGRect und Layer und ... BLAH. Nicht gut; Verwenden Sie das automatische Layout und eine benutzerdefinierte UITableViewCell. Erstellen Sie in dieser UITableViewCell anstelle einer Unteransicht Ihres Inhalts in der Inhaltsansicht eine neue Containeransicht (eine UIView), zeigen Sie die Containeransicht in der Inhaltsansicht an und zeigen Sie dann alle Ihre Ansichten in der Containeransicht an.
Um den Abstand jetzt festzulegen, bearbeiten Sie einfach die Layoutränder der Containeransicht wie folgt:
quelle
Versuchen Sie, - (UIEdgeInsets) layoutMargins; auf der Zelle
quelle
Meine Situation war, dass ich benutzerdefinierte UIView verwendet habe, um ForFeaHeader im Abschnitt auch heightForHeader im Abschnitt anzuzeigen. Konstante Höhe zurückgeben, z. B. 40, Problem war, wenn keine Daten vorhanden sind, wurden alle Header-Ansichten berührt. Also wollte ich zwischen den Abschnitten Platz machen, wenn keine Daten vorhanden sind. Also habe ich das Problem behoben, indem ich einfach die Ebene "Tabellenansicht" in "Gruppe" geändert habe. Und es hat bei mir funktioniert.
quelle
Schauen Sie sich meine Lösung auf GitHub mit Unterklassen
UITableView
und Verwendung der Laufzeitfunktionen von Objective-C an.Grundsätzlich wird die private Datenstruktur von Apple verwendet
UITableViewRowData
, für die ich einen privaten Laufzeitheader durchsucht habeUITableView
:https://github.com/JaviSoto/iOS10-Runtime-Headers/blob/master/Frameworks/UIKit.framework/UITableView.h ,
und hier ist die gewünschte private Klasse, die alles enthält, was Sie benötigen, um die Abstände Ihrer Zellen so zu gestalten, wie Sie möchten, ohne sie in den Klassen der Zellen festzulegen:
https://github.com/JaviSoto/iOS10-Runtime-Headers/blob/master/Frameworks/UIKit.framework/UITableViewRowData.h
quelle
Ich hatte Probleme, dies neben Hintergrundfarben und Zubehöransichten in der Zelle zum Laufen zu bringen. Am Ende musste ich:
1) Legen Sie die Eigenschaft für die Hintergrundansicht der Zellen mit einem UIView-Satz mit einer Hintergrundfarbe fest.
2) Positionieren Sie diese Ansicht in layoutSubviews neu, um die Idee des Abstands hinzuzufügen
quelle
Die Verwendung der Überschriften als Abstand würde gut funktionieren, wenn Sie keine Überschriften verwenden möchten. Ansonsten wahrscheinlich nicht die beste Idee. Ich denke, ich erstelle eine benutzerdefinierte Zellenansicht.
Beispiele:
Erstellen Sie in der benutzerdefinierten Zelle eine Hintergrundansicht mit Einschränkungen, damit nicht die gesamte Zelle ausgefüllt wird, und füllen Sie sie auf.
Machen Sie dann den Hintergrund der Tabellenansicht unsichtbar und entfernen Sie die Trennzeichen:
quelle
Wenn Sie den Abschnitt und die Zeilennummer Ihrer Tabellenansicht nicht ändern möchten (wie ich), gehen Sie wie folgt vor:
1) Fügen Sie eine ImageView am unteren Rand Ihrer Tabellenzellenansicht hinzu.
2) Stellen Sie die gleiche Farbe wie die Hintergrundfarbe der Tabellenansicht ein.
Ich habe dies in meiner Anwendung getan und es funktioniert perfekt. Prost! : D.
quelle
SWift-5, Abstand zwischen UITableViewCell
quelle
Sie können die Einschränkung einfach wie folgt in Code verwenden:
Es ist wichtig, eine Unteransicht (Container) hinzuzufügen und andere Elemente darin zu platzieren.
quelle
Swift 5.0 Lösung
Innerhalb der UITableViewCell-Unterklasse
quelle
Fügen Sie der Zelle eine innere Ansicht hinzu, und fügen Sie dann Ihre eigenen Ansichten hinzu.
quelle
Verwenden Sie UITableViewDelegate
heightForRowAtIndexPath
und geben Sie die Zeilenhöhe zurück.quelle