2016-09-11 1 views
0

Ich habe programmgesteuert eine TableView mit Abschnitten in Swift erstellt. Die Anzahl der Abschnitte und Zeilen wird immer gleich sein, da sie nur Informationen anzeigen, die ich aus Firebase abrufe.Zelle TextLabel nach oben links programmgesteuert in swift

Ich möchte den TextLabel einer der Zellen an der Spitze ausrichten, anstatt der Mitte der Zelle. Alle anderen TextLabels möchte ich zentriert bleiben. Die betreffende Zelle ist Abschnitt 1, Zeile 1.

Es sieht derzeit wie:

enter image description here

Ich habe lange gesucht, wie dies für eine Weile zu tun, und eine Menge Leute sagen, do:

cell.textLabel?.numberOfLines = 0 
cell.textLabel?.sizeToFit() 

Aber das funktioniert nicht. Ich lege diesen Code in meine cellForRowAtIndexPath Methode.

if indexPath.section == 0 { 
     if indexPath.row == 0 { 
      cell.textLabel!.text = "Our review" 
     } else { 
      cell.textLabel!.text = film?.Main_Review 
      cell.textLabel?.numberOfLines = 0  // HERE 
      cell.textLabel?.sizeToFit()   // HERE 
     } 
} 

Nichts passiert, der Text ist immer noch auf das Zentrum der Zelle ausgerichtet.

Kennt jemand eine einfache Möglichkeit, dies zu tun? Vorzugsweise ohne eine benutzerdefinierte Zelle erstellen zu müssen (da dies nur 1 Zeile benötigt)? Dank

UPDATE - All Code für cellForRowAtIndexPath

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

    let cell: UITableViewCell = UITableViewCell(style: .Value1, reuseIdentifier: cellId) 

    cell.selectionStyle = .None 
    cell.textLabel?.font = UIFont(name: "Verdana", size: 14) 
    cell.textLabel?.textColor = UIColor.darkGrayColor() 
    cell.detailTextLabel?.font = UIFont(name: "Verdana", size: 14) 


    if indexPath.section == 0 { 
     if indexPath.row == 0 { 
      cell.textLabel!.text = "Share" 
     } 
    } else if indexPath.section == 1 { 
     if indexPath.row == 0 { 
      cell.textLabel!.text = "Our review" 
     } else { 
      cell.textLabel!.text = film?.Main_Review 
      cell.textLabel?.numberOfLines = 0 
      cell.textLabel?.sizeToFit() 
     } 
    } else if indexPath.section == 2 { 
     if indexPath.row == 0 { 
      cell.textLabel!.text = "UK release date" 
      cell.detailTextLabel!.text = film?.Date_Released?.capitalizedString 
     } else if indexPath.row == 1 { 
      cell.textLabel!.text = "Directed by" 
      cell.detailTextLabel!.text = film?.Directed_By?.capitalizedString 
     } else if indexPath.row == 2 { 
      cell.textLabel!.text = "Running time" 
      cell.detailTextLabel!.text = film?.Running_Time 
     } else { 
      cell.textLabel!.text = "Certificate rating" 
      cell.detailTextLabel!.text = film?.Certificate_Rating 
     } 
    } 

    return cell 

} 
+0

Können Sie bitte verwenden sagen wie diese Bedingung jemals zum Erfolg führt 'if indexPath.section == 0 {if i ndexPath.section == 1 {', wie es möglich ist –

+0

@NDoc Vielen Dank! Das war mein Fehler - jetzt aktualisiert. – Nick89

+0

schreibe alle 'cellForRowAtIndexPath' – Vyacheslav

Antwort

1

cell.textLabel ist eine Standardbezeichnung in UITableViewCell. Wenn Sie möchten, dass Ihr Text oben beginnt, erstellen Sie eine Unterklasse von UITableViewCell und erstellen Sie eine eigene Ansicht für diese Zelle. Zum Beispiel

import Foundation 
import UIKit 

class ItemCell: UITableViewCell { 

var label : UILabel! 

override init(style: UITableViewCellStyle, reuseIdentifier: String?) { 
    super.init(style: style, reuseIdentifier: reuseIdentifier) 
    self.label = UILabel() 
    self.contentView.addSubview(label) 
} 

required init?(coder aDecoder: NSCoder) { 
    fatalError("init(coder:) has not been implemented") 
} 

override func layoutSubviews() { 
    super.layoutSubviews() 

    self.label.frame = CGRectMake(15,10,200,30) 
    self.label.adjustsFontSizeToFitWidth = true 
    self.label.textColor = UIColor.greenColor() 

} 

}

Dann in Ihrem Viewcontroller vergessen Sie nicht das Register Klassenmethode wie diese

self.tableView.dataSource = self 
    self.tableView.delegate = self 
    self.tableView.registerClass(ItemCell.self, forCellReuseIdentifier: "cellIdentifier") 

Und in Ihrem cellForRowAtIndexPath

let cell:ItemCell! = tableView.dequeueReusableCellWithIdentifier("cellIdentifier") as? ItemCell 
+0

@MatGrit Danke dafür. Ich habe getan, wie Sie gesagt haben, aber das Etikett zeigt nicht. Es gibt keinen Fehler, einfach nur für diese Zeile leer. Irgendwelche Gedanken? – Nick89

+0

@MatGrit Was meinst du mit 'self.descr.frame.maxY + 10'? – Nick89

+0

Meine schlechte, anstelle von self.descr 10 setzen. Sie müssen auch etwas Text in der Bezeichnung hinzufügen. Um zu debuggen, versuche, dem Label eine Hintergrundfarbe hinzuzufügen. –

0
cell.textLabel?.sizeToFit() 

sollte Ihre UILabel hat die Größe benötigt es, den Inhalt zu wickeln. Sie können also den Hintergrund ändern, um zu sehen, ob diese Linie die Aufgabe erfüllt. Ich vermute, das Problem sind Ihre Einschränkungen in der Zelle. Sie sollten einen Blick auf Ihren Code oder Ihre Storyboards werfen. Autolayout tutorial

Hinweis: Sie sollten Ihre Frage bearbeiten, sonst könnten Sie ein paar Negative dafür bekommen. Wenn es sich um Abschnitt 0 handelt, kann es sich nicht um Abschnitt 1 handeln.

+0

Danke @TomCobo - Code bereits geändert :) – Nick89

+0

Ich verwende keine Storyboards, das ist alles programmgesteuert erstellt. – Nick89

+0

Sie könnten einige Einschränkungen programmatisch hinzufügen oder Ihren Code anzeigen, wo Sie ihn hinzufügen – TomCobo

Verwandte Themen