2009-03-25 9 views
19

Buduję mały, mały klient Twittera na iPhonie. Oczywiście wyświetlam tweety w UITableView i oczywiście mają one różne długości. Mam dynamicznie zmieniających wysokość komórki w oparciu o tekst całkiem dobrze:UITableView z dynamicznymi wysokościami komórek - co muszę zrobić, aby naprawić przewijanie w dół?

- (CGFloat)heightForTweetCellWithString:(NSString *)text { 
    CGFloat height = Buffer + [text sizeWithFont:Font constrainedToSize:Size lineBreakMode:LineBreakMode].height; 
    return MAX(height, MinHeight); 
} 

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 
    NSString *text = // get tweet text for this indexpath 
    return [self heightForTweetCellWithString:text]; 
    } 
} 

mam wyświetlanie rzeczywistej komórkę tweet za pomocą algorytmu w książce PragProg:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    static NSString *CellIdentifier = @"TweetCell"; 
    TweetCell *cell = (TweetCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
    cell = [self createNewTweetCellFromNib]; 
    } 
    cell.tweet.text = // tweet text 
    // set other labels, etc 
    return cell; 
} 

Kiedy uruchomić do góry, wszystkie widoczne tweety wyświetlają się dobrze. Jednak kiedy przewijam w dół, tweety poniżej są dość roztrzepane - wydaje się, że gdy komórka przewinie się poza ekranem, wysokość komórki dla tej powyżej zostanie zmieniona na większą, niż powinna, i zasłania część komórka pod nim. Gdy komórka osiągnie szczyt widoku, resetuje się i renderuje poprawnie. Przewijanie nie przedstawia żadnych trudności.

Oto film, który pokazuje w działaniu: http://screencast.com/t/rqwD9tpdltd

Próbowałem trochę już: zmiana rozmiaru ramki komórki na tworzenie, stosując różne identyfikatory dla komórek o różnych wysokościach (tj [NSString stringWithFormat:@"Identifier%d", rowHeight]), właściwości zmieniających w konstruktorze interfejsów ...

Jeśli istnieją dodatkowe fragmenty kodu, które można publikować, proszę dać mi znać. Z góry dziękuje za twoją pomoc!

+0

Jakie są wartości "rozmiaru" i "czcionki" w twoim przykładzie? Ciekawi mnie trochę więcej kodu. – Moshe

Odpowiedz

8

Westchnienie. Okazuje się, że nie poprawiłem wszystkich właściwości całkiem dobrze. Ale przynajmniej pozbyłem się tego błędu. :)

To zachowanie zostało naprawione przez upewnienie się, że sprawdzono właściwość "Clip Subviews" urządzenia UITableViewCell.

Zachowanie zostało spowodowane deklaracją, że moja tweetowa etykieta tekstowa ma maksymalną wysokość niezbędną - gdy subviews od komórki tabeli nie były obcięte, etykieta w powyższej komórce byłaby renderowana na wierzchu komórki poniżej. Nie było to widoczne przy pierwszym renderowaniu ekranu z powodu kolejności, w której SDK renderuje komórki - w dół - i jak układa się jeden nad drugim.