2011-09-28 15 views
7

Mam wyszukiwane i wyszukiwane przez niekończące się blogi i artykuły na temat ustalania dynamicznej wysokości niestandardowego UITableViewCell i jego szczegółowy tekst. Naprawdę ciężko mi było znaleźć dobrą dokumentację na ten temat.Niestandardowy UITableView Dynamiczny wzrost komórki

Co muszę zrobić, to mieć komórka rosnąć zgodnie z tekstem w środku, ale nigdy nie schodzi poniżej wysokości 70

Próbowałem kilka odpowiedzi na tego typu pytania tutaj na StackOverflow ale żaden z nich zadziałało. Cała moja aplikacja jest już prawie skończona, ale naprawdę muszę to osiągnąć, zanim wydam i jej kłopot.

Oto, co próbuję, ale po prostu nachodzą na siebie zachodzące na siebie komórki. Z tego, co przeczytałem, muszę znaleźć ramkę, jeśli komórka niestandardowa lub widok tekstowy w komórce również, ale nie jestem pewien, jak to zrobić lub wymieszać je wszystkie razem, aby zwrócić jedną wysokość.

Każda pomoc zostanie bardzo doceniona Dziękujemy! Metoda

- (CGFloat) tableView: (UITableView *) tableView heightForRowAtIndexPath: (NSIndexPath 
*) indexPath 
{ 

    CGSize aSize; 
aSize = [[(Tweet*)[tweets objectAtIndex:indexPath.row]tweet] sizeWithFont:[UIFont 
systemFontOfSize:14] 
      constrainedToSize:CGSizeMake(300.0, 1000.0) 
       lineBreakMode:UILineBreakModeTailTruncation]; 

return aSize.height; 
} 
+0

http://imageshack.us/photo/my-images/508/screenshot2011092816313.png – FreeAppl3

+0

Obraz pokazuje, co mam z niemal każdej metodzie staram! Wydaje się, że pobiera rozmiar każdego ciągu tekstowego, ale nie zmienia rozmiaru komórek. – FreeAppl3

Odpowiedz

18

miałem podobny problem jakiś czas temu i to pomogło mi ogromnie.

#define PADDING 10.0f 
- (CGFloat)tableView:(UITableView *)t heightForRowAtIndexPath:(NSIndexPath *)indexPath { 
    NSString *text = [self.items objectAtIndex:indexPath.row]; 
    CGSize textSize = [text sizeWithFont:[UIFont systemFontOfSize:14.0f] constrainedToSize:CGSizeMake(self.tableView.frame.size.width - PADDING * 3, 1000.0f)]; 

    return textSize.height + PADDING * 3; 
} 
+0

Musiałem zastąpić pierwszy "PADDING * 3" przez "PADDING * 4", a drugi "PADDING * 3" z "PADDING * 2" .... –

+0

Tak, ty będzie musiał dostosować się do konkretnych potrzeb, ale to tylko podstawa. – WrightsCS

+5

Powinieneś zauważyć, że 'sizeWithFont: constrainedToSize:' jest przestarzałe w iOS 7, więc powinieneś użyć 'boundingRectWithSize: options: attributes: context:' –

-4

Zastosowanie UITableViewDelegate:

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
// here you need to get height of your textlabel in your custom cell. 
MyCustomCell *myCell = (MyCustomCell *)[tableView cellForRowAtIndexPath:indexPath]; 
return myCell.myTextLabel.frame.size.height + 20; 
} 

coś takiego

+0

Pierwsza linia kodu [tableView cellForRowAtIndexPath: indexPath]; po prostu powoduje awarię aplikacji .... dziękuję za odpowiedź: – FreeAppl3

+0

To się zawiesza, ponieważ nie masz jeszcze komórek. Nie myślałem o tym, przepraszam. Odpowiedź WrightsCS powinna pomóc –

+0

Zepsuł się, "EXE_BAD_ACCESS" – HelloWorld

3

Hej tam, więc masz zamiar trzeba przechowywać listę ciągi w NSArray i następnie masz zamiar trzeba obliczyć wysokość nsstring przy użyciu sizeWithFont: constrainedToSize: dokumentacja znajduje się tutaj http://developer.apple.com/library/ios/#documentation/UIKit/Reference/NSString_UIKit_Additions/Reference/Reference.html

, więc twoja tabelaView method shoul d wyglądać

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
NSDictionary *stringAttributes = [NSDictionary dictionaryWithObject:[UIFont fontWithName:"Helvetica" size:9] forKey: NSFontAttributeName]; 

    CGSize cell_size = [string boundingRectWithSize:CGSizeMake(300,999) 
          options:NSStringDrawingTruncatesLastVisibleLine|NSStringDrawingUsesLineFragmentOrigin  
          attributes:stringAttributes context:nil].size; 
if (cell_size.height > 70) 
{ 
return cell_size.height; 
} 
else 
{ 
return 70; 
} 
} 

EDIT: to zostało zaktualizowane do iOS 7

0

Właśnie napisałem o tym problemie i jak ostatecznie zdecydowałem się go rozwiązać. Możesz przeczytać o tym tutaj: Dynamic UITableView Cell Height Based on Contents

Zasadniczo stworzyłem podklasę UITableView, która automatyzuje obsługę i obliczanie dynamicznej wysokości komórki dla komórek domyślnych i niestandardowych. To nie jest srebrna kula i prawdopodobnie trzeba ją rozszerzyć i zmodyfikować, ale użyłem jej tak, jak w kilku aplikacjach z dobrym rezultatem.

Można pobrać kod tutaj: https://github.com/danielsaidi/AutoSizeTableView

Nadzieję, że to pomaga!

(... a jeśli nie, chciałbym usłyszeć, dlaczego nie)

0

Próbowałem wiele rozwiązań, ale ten, który pracował był ten, zaproponowany przez znajomego:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 

    int height = [StringUtils findHeightForText:yourLabel havingWidth:yourWidth andFont:[UIFont systemFontOfSize:17.0f]]; 

    height += [StringUtils findHeightForText:yourOtherLabel havingWidth:yourWidth andFont:[UIFont systemFontOfSize:14.0f]]; 

    return height + CELL_SIZE_WITHOUT_LABELS; //important to know the size of your custom cell without the height of the variable labels 
} 

StringUtils.h klasa:

#import <Foundation/Foundation.h> 

    @interface StringUtils : NSObject 

    + (CGFloat)findHeightForText:(NSString *)text havingWidth:(CGFloat)widthValue andFont:(UIFont *)font; 

    @end 

StringUtils.Klasa m:

#import "StringUtils.h" 

    @implementation StringUtils 

    + (CGFloat)findHeightForText:(NSString *)text havingWidth:(CGFloat)widthValue andFont:(UIFont *)font { 
     CGFloat result = font.pointSize+4; 
     if (text) { 
      CGSize size; 

      CGRect frame = [text boundingRectWithSize:CGSizeMake(widthValue, CGFLOAT_MAX) 
               options:NSStringDrawingUsesLineFragmentOrigin 
              attributes:@{NSFontAttributeName:font} 
               context:nil]; 
      size = CGSizeMake(frame.size.width, frame.size.height+1); 
      result = MAX(size.height, result); //At least one row 
     } 
     return result; 
    } 

    @end 

Wszystko zadziałało idealnie. Miałem niestandardową komórkę z 3 obrazami o stałych rozmiarach, 2 etykietami o ustalonych rozmiarach i 2 etykietami zmiennymi. Pracował jak urok. Mam nadzieję, że to działa również dla ciebie.

Pozdrawiam, Alexandre.

0

iOS 7

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section 
{ 
    NSString *text = @"Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello HelloHello HelloHello HelloHello HelloHello HelloHello Hello"; 

    CGRect rect = [text boundingRectWithSize:CGSizeMake(280.0f, CGFLOAT_MAX) options:NSStringDrawingTruncatesLastVisibleLine|NSStringDrawingUsesLineFragmentOrigin attributes:@{ 
     NSFontAttributeName: [UIFont fontWithName:@"Hellvetica" size:14.0f] 
    } context:nil]; 

    return CGSizeMake(320.0f, ceil(rect.size.height) + 10.0f); 
} 
Powiązane problemy