2013-06-05 10 views
7

Hallo allerseits Ich habe Probleme mit meinem tableview, i Handy macht mit uilabel mit SizeToFit und dann berechnen die UILabel Höhe für die Zelle Höhe alles gesetzt funktioniert gut, außer, wenn ich meinen tableView der Text scrollen bekommen seltsam wie ein Zeichen pro Zeile:UITableView mit UILabel SizeToFit Schlamassel beim Scrollen

Meine TableViewVell Methode ist:

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

if (cell == nil) { 
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 
} 


UILabel *label = (UILabel *)[cell viewWithTag:1]; 
label.text = [someArray objectAtIndex:indexPath.row]; 
// Set the UILabel to fit my text; 
messageLabel.lineBreakMode = UILineBreakModeWordWrap; 
messageLabel.numberOfLines = 0; 
[messageLabel sizeToFit]; 


return cell; 
} 

die Zellenhöhe Aufenthalt in der richtigen Größe nur das Problem mit den UILabel ... dies das Ergebnis, wenn ich laden Sie die Ansicht:

First screenshot

Und das ist, nachdem ich den Tableview starten blättern:

Second screenshot

Jede Hilfe ???

+0

Was messageLabel ist und ist es anders als das Etikett einer Zeile oberhalb – Zen

+0

Wo haben Sie die Zelle der Ansicht erstellen. Vielleicht möchten Sie nur die lineBreakMode-Eigenschaft von labell festlegen. – Zen

+0

awooo tut mir leid, ich habe es repariert, ich habe nur die Namen geändert, damit es einfach zu lesen ist –

Antwort

1

Sie wahrscheinlich Ihre Zelle Unterklasse sollte und reinigen Sie die UILabel auf

override func prepareForReuse() { 
    super.prepareForReuse() 
    self.label.text = nil 
} 
19

Die Methode sizeToFit berücksichtigt die Breite des Rahmens und passt die height an. Und die Tabellenansichtszelle verwendet die Zellen erneut. Die Kombination dieser beiden Verhaltensweisen kann das beschriebene Problem verursachen.

Eines Ihrer Labels, das sehr kurz im Inhalt ist (z. B. in der vierten Zelle mit dem Wort "jio"), wird mit sizeToFit verkleinert und die resultierende Breite ist kleiner als die ursprüngliche Breite, die Sie beabsichtigten.

Anschließend wird die Zelle in der Tabellenansicht erneut verwendet, und sizeToFit berücksichtigt immer noch die geringe Breite, die aus dem vorherigen Aufruf von sizeToFit berechnet wurde.

Lösungen:

1) stellen Sie die Breite des Rahmens zu Ihrem ursprünglichen jedesmal beabsichtigte Etikettenbreite, bevor Sie sizeToFit nennen:

CGRect frame = messageLabel.frame; 
frame.size.width = 100.0; //you need to adjust this value 
messageLabel.frame = frame; 

2) Ihre Zeilenhöhe Berechnung verwenden und die Rahmenhöhe stattdessen gesetzt . Keine Notwendigkeit, sizeToFit zu verwenden.

+0

Sie können mir bitte einen Beispielcode geben :)? –

+0

@DekelMaman Ich habe meine Antwort aktualisiert. –

+0

Getting this Fehler: Initialisierung von 'CGRect *' (aka 'struct CGRect *') mit einem Ausdruck des inkompatiblen Typs 'CGRect' (aka 'struct CGRect') In der Zeile CGRect * frame = messageLabel.frame; –

0

Wenn Sie nicht mit automatischen Layouts sind, kann dies auch durch das Hinzufügen einer Kategorie auf UIView

public func sizeToFit(constrainedSize: CGSize) -> CGSize { 
    var newSize = sizeThatFits(constrainedSize) 
    newSize.width = min(newSize.width, constrainedSize.width) 
    newSize.height = min(newSize.height, constrainedSize.height) 
    self.size = newSize 
    return newSize 
} 

Die Idee sizeThatFits mit einer beschränkten Größe zu verwenden ist gelöst werden, um die Größe zu bestimmen, zu übernehmen und dann Verwenden Sie die erwartete Mindestbreite/-höhe.

Dann müssen Sie nur noch wie

etwas tun
yourLabel.sizeToFit(self.contentView.size) // or 
yourLabel.sizeToFit(CGSize(width: maxWidth, height: self.contentView.size.height)) 
0

Sie Width-Eigenschaft des Etiketts bevorzugt eingestellt werden. Das war für mich

preferred Width

Verwandte Themen