2011-09-28 21 views
7

Ho ricerca e cercato attraverso infinite blog e articoli su come determinare un'altezza dinamico per una consuetudine UITableViewCell e il suo testo dettagliato. Ho davvero avuto difficoltà a trovare una buona documentazione su questo.personalizzata UITableView dinamica cellulare Altezza

Che cosa devo fare è avere la cellula a crescere secondo il testo all'interno ma mai scendere sotto un'altezza di 70.

ho provato molte delle risposte per questo tipo di domanda qui su StackOverflow ma nessuno di loro ha funzionato. La mia intera app è quasi terminata, ma ho davvero bisogno di ottenere questo risultato prima di rilasciarlo e il suo problema.

Ecco che cosa sto provando, ma ottengo solo uno slop di celle che si sovrappongono l'un l'altro. Da quello che ho letto ho bisogno di trovare la cornice se la cella personalizzata o la visualizzazione testo nella cella, ma non sono sicuro di come farlo o di mescolarli tutti insieme per restituire una altezza.

Qualsiasi aiuto sarebbe molto apprezzato Grazie! Metodo

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

L'immagine mostra quello che ottengo con appena circa ogni metodo che cerco! Sembra che stia ottenendo la dimensione di ogni stringa di testo ma non ridimensionando le celle – FreeAppl3

risposta

18

ho avuto un problema simile un po 'indietro e questo mi ha aiutato enormemente.

#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

Ho dovuto sostituire il primo "PADDING * 3" con "PADDING * 4" e quest'ultimo "PADDING * 3" con "PADDING * 2" .... –

+0

Sì dovrà adattarsi in base alle tue esigenze specifiche ma questa è solo una base. – WrightsCS

+5

Si noti che 'sizeWithFont: constrainedToSize:' è deprecato in iOS 7, quindi è necessario utilizzare 'boundingRectWithSize: options: attributes: context:' –

-4

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

Qualcosa di simile

+0

La prima riga di codice [tableView cellForRowAtIndexPath: indexPath]; fa in modo che l'app si arresti in modo anomalo .... grazie per la risposta però – FreeAppl3

+0

Si blocca perché non hai ancora le celle. Non ci ho pensato, mi dispiace. La risposta di WrightsCS dovrebbe aiutare –

+0

E 'stata creata una stringa, "EXE_BAD_ACCESS" – HelloWorld

3

Hey là in modo che si sta per necessità di memorizzare l'elenco di stringhe in un NSArray e poi si sta andando ad avere bisogno di calcola l'altezza di nsstring usando sizeWithFont: constrainedToSize: la documentazione si trova qui http://developer.apple.com/library/ios/#documentation/UIKit/Reference/NSString_UIKit_Additions/Reference/Reference.html

così il tuo tavoloVisualizza metodo d simile a

-(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: questo è stato aggiornato per iOS 7

0

Ho appena scritto su questo problema e su come ho finalmente deciso di risolverlo. Puoi leggere qui: Dynamic UITableView Cell Height Based on Contents

Fondamentalmente, ho creato una sottoclasse UITableView che automatizza la gestione e il calcolo dell'altezza della cella dinamica per entrambe le celle predefinite e personalizzate. Non è un proiettile d'argento e probabilmente deve essere esteso e ottimizzato, ma l'ho usato come è in diverse app con un buon risultato.

È possibile afferrare il codice qui: https://github.com/danielsaidi/AutoSizeTableView

Speranza che aiuta!

(... e se così non fosse, mi piacerebbe sentire perché no)

0

ho provato molte soluzioni, ma quello che ha funzionato è stato questo, suggerito da un amico:

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

La classe StringUtils.h:

#import <Foundation/Foundation.h> 

    @interface StringUtils : NSObject 

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

    @end 

StringUtils.m classe:

#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 

Ha funzionato perfettamente per me. Ho avuto una cella personalizzata con 3 immagini con dimensioni fisse, 2 etichette con dimensioni fisse e 2 etichette variabili. Ha funzionato come un fascino. Spero che funzioni anche per te.

Cordiali saluti, 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); 
} 
Problemi correlati