2012-12-20 6 views
5

Ich habe überall gesucht und habe meine Antwort nicht ganz gefunden.iPhone - Erstellen benutzerdefinierter UITableViewCell oberen und unteren Grenzen

Ich befüllen ein UITableView mit dynamischen Zellen aus JSON und ich versuche, alle zusätzlichen Zellen zu verstecken. Ich habe die Separatoren in IB ausgeschaltet, und natürlich verschwinden alle Zellseparatoren. Wie füge ich am unteren und oberen Ende jeder Tabellenansicht eine Zeile hinzu, so dass nur die Zellen, die Informationen enthalten, einen Rahmen aufweisen? Ich habe Quartz importiert und habe mit CALayer gespielt, kann aber keine Lösung finden.

Ich fand eine ähnliche Frage hier, aber die einzige Antwort war nicht sehr hilfreich.

Was wäre eine bessere, andere Art, dies zu tun?

Hier sind meine cellForRowAtIndexPath und meine numberOfRowsInSection:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 

    // Return the number of rows in the section. 
    //set equal to the information in the array 

    return [_jsonDataArray count]; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"Cell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; 

    //create Dictionary of data in row 
    NSDictionary *jsoninfo = [_jsonDataArray objectAtIndex:indexPath.row]; 

    //get required keys from dictionary and assign to vairables 
    NSString *title = [jsoninfo objectForKey:@"title"]; 
    NSString *subtitle = [jsoninfo objectForKey:@"subtitle"]; 
    NSURL *imageURL = [NSURL URLWithString:[jsoninfo objectForKey:@"series_image_URL"]]; 

    //download the images. 
    NSData *imgData = [NSData dataWithContentsOfURL:imageURL]; 
    UIImage *img = [[UIImage alloc] initWithData:imgData]; 


    //set boarder for custom cells... I need to have a border on the top and bottom of the cells I am creating so xcode does not autofill the empty space. 



    //fill in text to cells 
    cell.textLabel.text = title; 
    cell.detailTextLabel.text = subtitle; 
    cell.imageView.image = img; 

    return cell; 
} 

Antwort

24

Ich denke auch, es ist nicht die beste Idee, aber wenn Sie das wirklich tun möchte, ist hier Code, wird erreichen, was Sie wollen:

tableView.separatorStyle = UITableViewCellSeparatorStyleNone; 

// Draw top border only on first cell 
if (indexPath.row == 0) { 
    UIView *topLineView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, 1)]; 
    topLineView.backgroundColor = [UIColor grayColor]; 
    [cell.contentView addSubview:topLineView]; 
} 

UIView *bottomLineView = [[UIView alloc] initWithFrame:CGRectMake(0, cell.bounds.size.height, self.view.bounds.size.width, 1)]; 
bottomLineView.backgroundColor = [UIColor grayColor]; 
[cell.contentView addSubview:bottomLineView]; 

diesen Code in der Methode tableView:cellForRowAtIndexPath: Put. Die endgültige Aussehen Ihrer UITableView wird so aussehen:

Table view with selective borders

Berücksichtigen Sie, dass diese für die Leistung ist nicht sehr gut, vor allem, wenn Sie eine Menge von Zellen haben. Wenn Sie eine größere Datenmenge haben, finden Sie unter this SO question Hilfe zur Optimierung der Zeichnung.

+0

Vielen Dank für die Hilfe. Was wäre der beste Weg, dies zu tun? Ich möchte es so schnell wie möglich machen. – Siriss

+0

Der bessere Weg wäre das Unterklassen 'UITableViewCell' und das Überschreiben der' drawRect: 'Methode mit dem Code in meiner verknüpften Frage. EDIT: Der Code, wie Sie in der Antwort mit mehr Upvotes sehen können. –

+0

Ich denke, dass Sie zumindest die "einfachere" Methode ausprobieren sollten, bevor Sie mit der Optimierung der Lösung fortfahren - Sie könnten feststellen, dass sie schnell genug ist. –

0

Es ist wie eine suboptimale Lösung klingt Ihre gültigen Zellen aus leeren mit Linien zu versuchen, „zu unterscheiden“. Ein überlegener Ansatz wäre, die Datenquelle zu bereinigen, bevor die Tabelle damit gefüllt wird.

+0

Ich erstelle sie nicht, aber xcode füllt den leeren Tabellenansichtsbereich mit leeren Zellen aus. Ich erstelle nur die Anzahl der Zellen in numberOfRowsInSection gleich der Anzahl der Objekte in meinem Datenarray. Momentan werden zwei Objekte und Zellen erstellt, aber xcode füllt den Rest aus. – Siriss

+0

Ich habe meine Antwort bearbeitet. Ich könnte dir vielleicht beim Erstellen von Zeilen helfen, aber es klingt einfach wie eine schlechte Idee ... – HackyStack

+0

Ich verstehe immer noch nicht, was du mit "Datenquelle bereinigen" meinst. Wie hat die Datenquelle etwas mit den Boardern auf einer UITableViewCell zu tun? Ich mache nur 2 Zellen, xcode macht den Rest automatisch, ich stelle mir vor, weil es Prototypzellen sind. Ich bin offen für jeden Weg, dies zu tun – Siriss

0

Verwenden Sie benutzerdefinierte Zellen. Ihre Datasoure (Modelle) sollten die Informationen in die benutzerdefinierten Zellen übertragen. Erstellen Sie innerhalb der benutzerdefinierten Zellenklasse einen Setter, der in jeder Zeile festgelegt werden kann. Als ....


  1. Allocation Ihrer benutzerdefinierte Zelle mit Wiederverwendung Id,

  2. die Eigenschaft übergibt, die zeigen soll, ob die Leitung determing:
    [Zelle setCustomLines: Modell. Eigentum];

  3. Rückgabe der Zelle;


Sie werden weit mehr Flexibilität haben die CustomCell, wie Sie wollen, Bilder, Linien, Farben zu entwerfen, oder andere Möglichkeiten Ihr Benutzer sieht einen Unterschied zwischen den Zellen im Stich gelassen.

Technisch wird Marcos Antwort funktionieren, und gute Arbeit an einer einfachen Lösung. Aber Sie werden das hier nicht viel weiter ausdehnen können.

1

nur versuchen, diese bei tableView:cellForRowAtIndexPath: Methode

[cell.contentView.layer setBorderColor:[UIColor grayColor].CGColor]; 
[cell.contentView.layer setBorderWidth:1.0f]; 
+0

Wäre gut, aber legt auch links und rechts Rand, was OP nicht will. –

0

Dies ist nicht die Antwort auf die Frage, aber die saubere Lösung für das ursprüngliche Problem.

Fügen Sie eine leere UIView als Fußzeile von UITableView hinzu. Dann werden die leeren Zellen versteckt. Siehe this answer.

Verwandte Themen