2013-06-05 18 views
7

Ciao a tutti ho un problema con il mio tableview, faccio cellulare con uilabel con SizeToFit e quindi calcolare il UILabel altezza per impostare l'altezza della cella tutto funziona bene, tranne quando ho scorrere la mia tableView il testo ottenere strano come uno char per riga:UITableView con UILabel SizeToFit ottenere pasticcio durante lo scorrimento

il mio metodo è TableViewVell:

-(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; 
} 

il soggiorno Altezza cella nella corretta dimensione del problema solo con la UILabel ....210 questo il risultato quando carico della vista:

First screenshot

E questo è, dopo comincio scorrere la TableView:

Second screenshot

Qualsiasi Aiuto ???

+0

Qual è messageLabel ed è diverso da l'etichetta di una riga sopra – Zen

+0

Dove hai creato vista della cellula. Potresti voler impostare solo la proprietà lineBreakMode dell'etichetta. – Zen

+0

mi dispiace averlo risolto, ho appena cambiato i nomi per renderlo più semplice da leggere –

risposta

1

probabilmente si dovrebbe sottoclasse tuo cellulare e pulire l'UILabel su

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

Il metodo sizeToFit rispetta la larghezza della cornice e regola height. E la cella di visualizzazione delle tabelle riutilizza le celle. La combinazione di questi due comportamenti può causare il problema che hai descritto.

Una delle etichette, che ha un contenuto molto breve (ad esempio nella quarta cella con la parola "jio"), viene ridimensionata con sizeToFit e la larghezza risultante è inferiore alla larghezza originale desiderata.

Successivamente, la vista tabella riutilizza la cella e sizeToFit rispetta ancora la larghezza ridotta calcolata dalla chiamata precedente di sizeToFit.

Soluzioni:

1) impostare la larghezza della cornice alla ogni destinazione larghezza dell'etichetta originale prima di chiamare sizeToFit:

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

2) utilizza il calcolo altezza della riga e impostare l'altezza telaio invece . Non è necessario utilizzare sizeToFit.

+0

Puoi darmi un esempio di codice :)? –

+0

@DekelMaman Ho aggiornato la mia risposta. –

+0

Ottenere questo errore: Inizializzazione di 'CGRect *' (aka 'struct CGRect *') con un'espressione di tipo incompatibile 'CGRect' (aka 'struct CGRect') Sulla riga CGRect * frame = messageLabel.frame; –

0

Se non si utilizza il layout automatico, questo può anche essere risolto con l'aggiunta di una categoria a 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 
} 

L'idea è quella di utilizzare sizeThatFits con una dimensione vincolata per determinare la dimensione di adottare e poi usa la larghezza/altezza minima prevista.

Poi devi solo fare qualcosa di simile

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

è possibile impostare preferito proprietà Width della label. Che ha lavorato per me

preferred Width