2013-06-05 23 views
7

Witam wszystkich mam problem z moim tableview robię komórkowy z uilabel z SizeToFit a następnie obliczyć UILabel Wysokość dla ustawiona komórka Wysokość wszystko działa dobrze, z wyjątkiem kiedy przewijanie mój tableView jej tekst dostać dziwne jak jeden char na linię:UITableView z UILabel SizeToFit dostać bałagan podczas przewijania

Moja TableViewVell Metoda jest:

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

pobyt komórkowych Wzrost w prawidłowy rozmiar problem tylko z UILabel ... ten wynik, kiedy załadować widok:

First screenshot

I to po tym, jak zaczynają przewijać Tableview:

Second screenshot

Każda pomoc ???

+0

Co jest messageLabel i różni się od etykiet jednym wierszu powyżej – Zen

+0

Skąd Utwórz widok komórki. Możesz tam ustawić tylko właściwość lineBreakMode etykiety. – Zen

+0

Naprawdę przepraszam Naprawiłem to, właśnie zmieniłem nazwy, żeby było łatwiej przeczytać –

Odpowiedz

1

powinieneś podklasy komórki i oczyścić UILabel na

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

Metoda jest zgodna z szerokością ramki i dostosowaniem height. A komórka widoku tabeli ponownie korzysta z komórek. Łączenie tych dwóch zachowań może spowodować problem, który opisałeś.

Jedna z twoich etykiet, która ma bardzo krótką treść (np. W czwartej komórce ze słowem "jio"), zmieniana jest o sizeToFit, a uzyskana szerokość jest mniejsza niż pierwotna szerokość, którą zamierzałeś.

Po tym widoku tabeli ponownie użyć komórki i sizeToFit nadal przestrzega małej szerokości obliczonej z poprzedniego połączenia sizeToFit.

Solutions:

1) ustawić szerokość ramki do oryginalnego zamierzonym szerokości etykiety za każdym razem przed wywołaniem sizeToFit:

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

2) korzystania z obliczenia wysokości wierszy i ustawić wysokość ramy zamiast . Nie trzeba używać sizeToFit.

+0

Możesz podać mi przykładowy kod :)? –

+0

@DekelMaman Zaktualizowałem swoją odpowiedź. –

+0

Otrzymywanie tego błędu: Inicjalizacja "CGRect *" (inaczej "struct CGRect *") z wyrażeniem niekompatybilnego typu "CGRect" (inaczej "struct CGRect") W wierszu CGRect * frame = messageLabel.frame; –

0

Jeśli nie używasz autolayout, może to być również rozwiązany poprzez dodanie kategorię na 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 
} 

Chodzi o to, aby używać sizeThatFits o ograniczonej wielkości, aby określić wielkość do przyjęcia, a następnie użyj minimalnej oczekiwanej szerokości/wysokości.

Wtedy po prostu trzeba zrobić coś jak

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

Można ustawić preferowany Szerokość własność etykiecie. Że pracował dla mnie

preferred Width