webentwicklung-frage-antwort-db.com.de

So fügen Sie einen Abstand zwischen UITableViewCell hinzu

Gibt es eine Möglichkeit, einen Abstand zwischen UITableViewCell hinzuzufügen?

Ich habe eine Tabelle erstellt und jede Zelle enthält nur ein Bild. Das Bild wird der Zelle folgendermaßen zugewiesen:

cell.imageView.image = [myImages objectAtIndex:indexPath.row];

dadurch wird das Bild jedoch vergrößert und passt in die gesamte Zelle. Zwischen den Bildern gibt es keinen Abstand.

Oder sagen wir auf diese Weise, dass die Bildhöhe z. 50, und ich möchte 20 Abstände zwischen den Bildern hinzufügen. Gibt es eine Möglichkeit, dies zu erreichen?

130
saili

Auf diese Weise füge ich einen Abstand zwischen den Zellen hinzu, um numberOfSections = "Your array count" zu machen und jeden Abschnitt nur eine Zeile enthalten zu lassen. Und definieren Sie dann headerView und seine Höhe. 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return yourArry.count;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return 1;
}

-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
    return cellSpacingHeight;
}

-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
    UIView *v = [UIView new];
    [v setBackgroundColor:[UIColor clearColor]];
    return v;
}
122
JonatWang

Schnelle Version

Aktualisiert für Swift 3

Diese Antwort ist etwas allgemeiner als die ursprüngliche Frage für zukünftige Zuschauer. Dies ist ein ergänzendes Beispiel für das grundlegende UITableView-Beispiel für Swift

enter image description here

Überblick

Die Grundidee besteht darin, für jedes Array-Element einen neuen Abschnitt (anstatt einer neuen Zeile) zu erstellen. Die Abschnitte können dann mithilfe der Höhe des Abschnittskopfs beabstandet werden.

Wie es geht

  • Richten Sie Ihr Projekt wie in UITableView-Beispiel für Swift beschrieben ein. _. (Fügen Sie also eine Variable UITableView hinzu und verbinden Sie den Ausgang tableView mit dem View Controller). 

  • Ändern Sie im Interface Builder die Hintergrundfarbe der Hauptansicht in hellblau und die Hintergrundfarbe UITableView in clear.

  • Ersetzen Sie den ViewController.Swift-Code durch Folgendes.

ViewController.Swift

import UIKit
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    // These strings will be the data for the table view cells
    let animals: [String] = ["Horse", "Cow", "Camel", "Sheep", "Goat"]

    let cellReuseIdentifier = "cell"
    let cellSpacingHeight: CGFloat = 5

    @IBOutlet var tableView: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()

        // These tasks can also be done in IB if you prefer.
        self.tableView.register(UITableViewCell.self, forCellReuseIdentifier: cellReuseIdentifier)
        tableView.delegate = self
        tableView.dataSource = self
    }

    // MARK: - Table View delegate methods

    func numberOfSections(in tableView: UITableView) -> Int {
        return self.animals.count
    }

    // There is just one row in every section
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 1
    }

    // Set the spacing between sections
    func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
        return cellSpacingHeight
    }

    // Make the background color show through
    func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
        let headerView = UIView()
        headerView.backgroundColor = UIColor.clear
        return headerView
    }

    // create a cell for each table view row
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell:UITableViewCell = self.tableView.dequeueReusableCell(withIdentifier: cellReuseIdentifier) as UITableViewCell!

        // note that indexPath.section is used rather than indexPath.row
        cell.textLabel?.text = self.animals[indexPath.section]

        // add border and color
        cell.backgroundColor = UIColor.white
        cell.layer.borderColor = UIColor.black.cgColor
        cell.layer.borderWidth = 1
        cell.layer.cornerRadius = 8
        cell.clipsToBounds = true

        return cell
    }

    // method to run when table view cell is tapped
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        // note that indexPath.section is used rather than indexPath.row
        print("You tapped cell number \(indexPath.section).")
    }
}

Beachten Sie, dass indexPath.section anstelle von indexPath.row verwendet wird, um die richtigen Werte für die Array-Elemente und die Tap-Positionen zu erhalten. 

Wie haben Sie die zusätzliche Polsterung/Platz rechts und links erhalten?

Ich habe es auf dieselbe Weise erhalten, wie Sie jeder Ansicht Abstand hinzufügen. Ich habe Auto-Layout-Einschränkungen verwendet. Verwenden Sie einfach das Stiftwerkzeug im Interface Builder, um Abstand für die führenden und nachlaufenden Abhängigkeiten hinzuzufügen.

117
Suragch

Meine einfache Lösung mit Swift

// Inside UITableViewCell subclass

override func layoutSubviews() {
    super.layoutSubviews()

    contentView.frame = contentView.frame.inset(by: UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10))
}

Ergebnis enter image description here

68
Husam

Ich musste das gleiche Konzept machen, dass UITableCells einen "Abstand" zwischen sich haben. Da Sie keinen Leerraum zwischen Zellen hinzufügen können, können Sie ihn fälschen, indem Sie die Zellenhöhe der UITableView bearbeiten und dann eine UIView zur contentView Ihrer Zelle hinzufügen. Hier ist ein Screenshot eines Prototyps, den ich in einem anderen Testprojekt gemacht habe, als ich das simulierte:

Spacing between UITableViewCells

Hier ist etwas Code (Hinweis: Es gibt viele hartcodierte Werte zu Demonstrationszwecken)

Zuerst musste ich die Variable heightForRowAtIndexPath einstellen, um unterschiedliche Höhen auf der UITableViewCell zu berücksichtigen.

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{

    NSString *text = [self.newsArray  objectAtIndex:[indexPath row]];
    if ([text isEqual:@"December 2012"])
    {
        return 25.0;
    }

    return 80.0;
}

Als Nächstes möchte ich das Aussehen und Verhalten der UITableViewCells so ändern, dass ich dies in der willDisplayCell:(NewsUITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath-Methode mache.

- (void)tableView:(UITableView *)tableView willDisplayCell:(NewsUITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (cell.IsMonth)
    {
        UIImageView *av = [[UIImageView alloc] initWithFrame:CGRectMake(20, 20, 20, 20)];
        av.backgroundColor = [UIColor clearColor];
        av.opaque = NO;
        av.image = [UIImage imageNamed:@"month-bar-bkgd.png"];
        UILabel *monthTextLabel = [[UILabel alloc] init];
        CGFloat font = 11.0f;
        monthTextLabel.font = [BVFont HelveticaNeue:&font];

        cell.backgroundView = av;
        cell.textLabel.font = [BVFont HelveticaNeue:&font];
        cell.textLabel.textColor = [BVFont WebGrey];
    }


    if (indexPath.row != 0)
    {
        cell.contentView.backgroundColor = [UIColor clearColor];
        UIView *whiteRoundedCornerView = [[UIView alloc] initWithFrame:CGRectMake(10,10,300,70)];
        whiteRoundedCornerView.backgroundColor = [UIColor whiteColor];
        whiteRoundedCornerView.layer.masksToBounds = NO;
        whiteRoundedCornerView.layer.cornerRadius = 3.0;
        whiteRoundedCornerView.layer.shadowOffset = CGSizeMake(-1, 1);
        whiteRoundedCornerView.layer.shadowOpacity = 0.5;
        [cell.contentView addSubview:whiteRoundedCornerView];
        [cell.contentView sendSubviewToBack:whiteRoundedCornerView];

    }
}

Beachten Sie, dass ich meine whiteRoundedCornerView-Höhe 70.0 erstellt habe. Dies ist der Grund für den simulierten Speicherplatz, da die Höhe der Zelle 80.0 beträgt. Mein contentView ist jedoch 70.0, was der Darstellung das Aussehen verleiht.

Es könnte andere Wege geben, um dies noch besser zu erreichen, aber so habe ich es auch gefunden. Ich hoffe es kann jemand anderem helfen.

39
Flea

Sie müssen Ihrem Bild einen Rahmen geben. Nicht getesteter Code lautet

cell.imageView.frame = CGRectOffset(cell.frame, 10, 10);
20
Chanok

Wenn Sie bereits keine Abschnittskopfzeilen (oder Fußzeilen) verwenden, können Sie sie verwenden, um den Tabellenzellen beliebige Abstände hinzuzufügen. Erstellen Sie anstelle eines Abschnitts mit n Zeilen eine Tabelle mit n Abschnitten mit jeweils einer Zeile.

Implementieren Sie die tableView:heightForHeaderInSection:-Methode, um den Abstand zu steuern.

Sie können auch tableView:viewForHeaderInSection: implementieren, um zu steuern, wie der Abstand aussieht.

7
Ferruccio

Ich denke, die einfachste Lösung, wenn Sie nur ein wenig Platz suchen und wahrscheinlich am wenigsten teuer wären, einfach die Zellrandfarbe auf die Hintergrundfarbe Ihrer Tabellen setzen und dann die Randbreite einstellen, um das gewünschte Ergebnis zu erhalten!

    cell.layer.borderColor = blueColor.CGColor
    cell.layer.borderWidth = 3
6
Craig

Ja, Sie können den Abstand (Abstand) zwischen zwei Zellen vergrößern oder verkleinern, indem Sie eine Basisansicht für die Inhaltsansicht in der Zelle erstellen. Legen Sie eine klare Farbe für den Hintergrund der Inhaltsansicht fest, und Sie können die Höhe der Basisansicht anpassen, um einen Abstand zwischen den Zellen zu schaffen.

3
divya d

Ich kann mir drei Ansätze vorstellen:

  1. Erstellen Sie eine benutzerdefinierte Tabellenzelle, die die Ansicht der gesamten Zelle in der gewünschten Weise darstellt

  2. Löschen Sie die Unteransichten von Der Bildansicht, anstatt das Bild zur Bildansicht hinzuzufügen. Erstellen Sie eine benutzerdefinierte Ansicht, die eine UIImageView für das Bild und eine andere Ansicht hinzufügt, möglicherweise eine einfache UIView, die die gewünschte Ansicht liefert Abstand und fügen Sie es als Unteransicht der Bildansicht hinzu.

  3. Ich möchte vorschlagen, dass Sie UIImageView direkt manipulieren, um eine feste Größe/Polsterung festzulegen, aber ich bin nirgends in der Nähe von Xcode, sodass ich nicht feststellen kann, ob/wie dies funktionieren würde.

Ist das sinnvoll?

3
csano

Swift 4.2 Lösung

// Inside UITableViewCell subclass
override func layoutSubviews() {    
    super.layoutSubviews()

    contentView.frame = contentView.frame.inset(by: UIEdgeInsets(top: 8, left: 8, bottom: 8, right: 8))
}
2
mehmetkoca

Beispiel in Swift 3 ..

 enter image description here

  1. Falten Sie eine einzelne Ansichtsanwendung
  2. fügen Sie TableView in View Controller hinzu
  3. fügen Sie eine benutzerdefinierte Zelle für eine Tablview-Zelle hinzu
  4. view Controller-Code ist wie folgt

       class ViewController: UIViewController,UITableViewDelegate,UITableViewDataSource {
    
       @IBOutlet weak var tableView: UITableView!
    
    
        var arraytable = [[String:Any]]()
         override func viewDidLoad() {
         super.viewDidLoad()
    
         arraytable = [
         ["title":"About Us","detail":"RA-InfoTech Ltd -A Joint Venture IT Company formed by Bank Asia Ltd"],
         ["title":"Contact","detail":"Bengal Center (4th & 6th Floor), 28, Topkhana Road, Dhaka - 1000, Bangladesh"]
    ]
    
    
    
    
    
    
       tableView.delegate = self
       tableView.dataSource = self
    
       //For Auto Resize Table View Cell;
      tableView.estimatedRowHeight = 44
       tableView.rowHeight = UITableViewAutomaticDimension
    
       //Detault Background clear
       tableView.backgroundColor = UIColor.clear
    }
    

    func numberOfSections (in tableView: UITableView) -> Int { return arraytable.count }

       func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
     return 1
     }
    
    // Set the spacing between sections
     func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return 10
    }
    
    // Make the background color show through
      func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let headerView = UIView()
    headerView.backgroundColor = UIColor.clear
    
    return headerView
    }
    
         func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    
         let cell = tableView.dequeueReusableCell(withIdentifier: "cell")! as! CustomCell
    
         cell.tv_title.text = arraytable[indexPath.section]["title"] as! String?
        cell.tv_details.text = arraytable[indexPath.section]["detail"] as! String?
    
       //label height dynamically increase
       cell.tv_details.numberOfLines = 0
    
    
    
    
       //For bottom border to tv_title;
       let frame =  cell.tv_title.frame
        let bottomLayer = CALayer()
       bottomLayer.frame = CGRect(x: 0, y: frame.height - 1, width: frame.width, height: 1)
        bottomLayer.backgroundColor = UIColor.black.cgColor
       cell.tv_title.layer.addSublayer(bottomLayer)
    
      //borderColor,borderWidth, cornerRadius
      cell.backgroundColor = UIColor.lightGray
      cell.layer.borderColor = UIColor.red.cgColor
      cell.layer.borderWidth = 1
      cell.layer.cornerRadius = 8
      cell.clipsToBounds = true
    
      return cell
      }
    
       }
    
  5. Laden Sie die vollständige Quelle zu Github herunter: Link 

    https://github.com/enamul95/CustomSectionTable

2
Enamul Haque

Ich denke, das ist die sauberste Lösung:

class MyTableViewCell: UITableViewCell {
    override func awakeFromNib() {
        super.awakeFromNib()
        layoutMargins = UIEdgeInsetsMake(8, 0, 8, 0)
    }
}
1
Aviel Gross

Dieser Artikel hat geholfen, es ist so ziemlich das, was die anderen Antworten sagten, aber zusammenfassend und prägnant 

https://medium.com/@andersongusmao/left-and-right-margins-on-uitableviewcell-595f0ba5f5e6

In diesem Fall wendet er sie nur auf die linke und rechte Seite an, aber mit der UIEdgeInsetsMake-Init können alle vier Punkte aufgefüllt werden.

func UIEdgeInsetsMake (_ oben: CGFloat, _ links: CGFloat, _ unten: CGFloat, _ rechts: CGFloat) -> UIEdgeInsets

Beschreibung
Erzeugt eine Edge-Einfügung für eine Schaltfläche oder Ansicht . Ein Einschub ist ein Rand um ein Rechteck. Positive Werte stehen für Ränder, die näher an der Mitte des Rechtecks ​​liegen, während negative Werte Ränder darstellen, die weiter vom Mittelpunkt entfernt sind.

Parameter
top: Der obere Teil eines Objekts.
left: Der Einschub links von einem Objekt
bottom: Der Einschub am unteren Rand eines Objekts.
right: Der Einsatz rechts von einem Objekt.

Kehrt zurück
Ein Einschub für eine Schaltfläche oder Ansicht

Beachten Sie, dass auch UIEdgeInsets verwendet werden können, um dies zu erreichen.

Xcode 9.3/Swift 4

1

Ich habe es in Swift 4 so gelöst.

Ich erstelle eine Erweiterung von UITableViewCell und füge folgenden Code hinzu:

override open var frame: CGRect {
    get {
        return super.frame
    }
    set (newFrame) {
        var frame =  newFrame
        frame.Origin.y += 10
        frame.Origin.x += 10
        frame.size.height -= 15
        frame.size.width -= 2 * 10
        super.frame = frame
    }
}

override open func awakeFromNib() {
    super.awakeFromNib()
    layer.cornerRadius = 15
    layer.masksToBounds = false
}

Ich hoffe es hilft dir.

1
JulianKro

Basierend auf Husams Antwort: Wenn Sie die Zellenebene 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 Randbedingungen der Zelle sowie der Einfügungen, da sonst die Ansicht nicht korrekt ist.

@implementation TableViewCell

- (void)awakeFromNib { 
    ... 
}

- (void) layoutSubviews {
    [super layoutSubviews];

    CGRect newFrame = UIEdgeInsetsInsetRect(self.layer.frame, UIEdgeInsetsMake(4, 0, 4, 0));
    self.layer.frame = newFrame;
}

@end
1
dev_exo

Schauen Sie in - (UIEdgeInsets) layoutMargins; In der Zelle

0
drunknbass

Ich war im selben Boot. Zuerst habe ich versucht, zu Abschnitten zu wechseln, aber in meinem Fall waren es mehr Kopfschmerzen als ich dachte, also habe ich nach einer Alternative gesucht. Um weiterhin Zeilen verwenden (und verwirren Sie sich nicht damit, wie Sie auf Ihre Modelldaten zugreifen), hier ist das, was für mich nur funktioniert, indem Sie mit einer Maske :

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath)
{
    let verticalPadding: CGFloat = 8

    let maskLayer = CALayer()
    maskLayer.cornerRadius = 10    //if you want round edges
    maskLayer.backgroundColor = UIColor.black.cgColor
    maskLayer.frame = CGRect(x: cell.bounds.Origin.x, y: cell.bounds.Origin.y, width: cell.bounds.width, height: cell.bounds.height).insetBy(dx: 0, dy: verticalPadding/2)
    cell.layer.mask = maskLayer
}

Alles, was Sie noch tun müssen, ist die Zellenhöhe um den gleichen Wert wie Ihre gewünschte verticalPadding erhöhen und dann Ihr inneres Layout so ändern, dass alle Ansichten, die einen Abstand zu den Rändern der Zelle hatten, den gleichen Abstand haben verticalPadding/2. Kleiner Nachteil: Sie erhalten verticalPadding/2-Abstand sowohl oben als auch unten in der tableView. Sie können dies jedoch schnell beheben, indem Sie tableView.contentInset.bottom = -verticalPadding/2 und tableView.contentInset.top = -verticalPadding/2 einstellen. Hoffe das hilft jemandem!

0

Meine Situation war, dass ich benutzerdefinierte UIView verwendet habe, um viewForHeader in section auch heightForHeader in section zu verwenden, mit konstanter Höhe, sagen wir 40. Das Problem war, wenn keine Daten vorhanden waren, die alle Header-Ansichten miteinander berührten. Also wollte ich zwischen den Abschnitten ohne Daten ein Leerzeichen setzen, also habe ich das Problem behoben, indem ich einfach die Ebene "tableview style" in "Group" geändert habe. Und es funktionierte für mich. 

0
Avijit Nagare

Ich hatte Probleme damit, dies neben den Hintergrundfarben und den zusätzlichen Ansichten in der Zelle zum Laufen zu bringen. Am Ende musste:

1) Legen Sie die Eigenschaften der Zellenhintergrundansicht mit einem UIView-Satz mit Hintergrundfarbe fest.

let view = UIView()
view.backgroundColor = UIColor.white
self.backgroundView = view

2) Positionieren Sie diese Ansicht in layoutSubviews neu, um die Idee des Abstandes hinzuzufügen 

override func layoutSubviews() {
    super.layoutSubviews()
    backgroundView?.frame = backgroundView?.frame.inset(by: UIEdgeInsets(top: 2, left: 0, bottom: 0, right: 0)) ?? CGRect.zero
}
0
Harry Bloom

Die Verwendung der Überschriften als Abstand würde gut funktionieren, wenn Sie keine Überschriften verwenden möchten. Ansonsten wohl nicht die beste Idee. Was ich denke, ist eine benutzerdefinierte Zellansicht zu erstellen.

Beispiele:

Erstellen Sie in der benutzerdefinierten Zelle eine Hintergrundansicht mit Einschränkungen, damit nicht die gesamte Zelle ausgefüllt wird.

Machen Sie dann den Hintergrund der Tabellenansicht unsichtbar und entfernen Sie die Trennzeichen:

// Make the background invisible
tableView.backgroundView = UIView()
tableView.backgroundColor = .clear

// Remove the separators
tableview.separatorStyle = .none
0
TJ Olsen

Wenn Sie die Schnitt- und Zeilennummer Ihrer Tabellenansicht nicht ändern möchten (wie ich es getan habe), 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 einwandfrei. Prost! : D

0
Deveesh

Schauen Sie sich meine -Lösung auf GitHub an, mit Unterklassen von UITableView und Laufzeitfunktionen von Objective-C.
Es verwendet im Wesentlichen die private Datenstruktur von Apple UITableViewRowData, die ich gefunden habe, um den privaten Laufzeitheader von UITableView zu durchsuchen:

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 Zellklassen zu setzen: 

https://github.com/JaviSoto/iOS10-Runtime-Headers/blob/master/Frameworks/UIKit.framework/UITableViewRowData.h

0
Gleb Linnik