2009-10-17 6 views
11

Durante la scrittura di una sottoclasse personalizzata di UITableViewCell, trovo che i risultati funzionino bene per le celle rettangolari di uno stile semplice UITableView, ma non funzionano affatto per le celle arrotondate in una tabella in stile raggruppato.Come sottoclasse in modo affidabile UITableViewCell per UITableView raggruppato?

C'è un modo per sottoclasse in modo affidabile UITableViewCell per disegnare celle che funzionano per tabelle in stile raggruppato? (Senza utilizzare Interface Builder.)

risposta

-1

Che problema stai avendo? In drawRect ti viene assegnato un rect e conosci la tua dimensione totale, semplicemente conformandoti a quello spazio. Se stai usando layoutsubviews, la stessa cosa.

+2

Il problema è UITableView in modalità raggruppati taglia parti delle cellule (i lati, per rivelare lo sfondo e arrotonda anche gli angoli della parte superiore e cellule inferiore di una sezione). – jbrennan

+0

Sì, questo è il problema. –

+1

Dopo alcuni test, hai ragione che le celle della vista tabella non vengono passate nella dimensione corretta in drawRect. Un approccio alternativo è quello di impostare un backgroundView personalizzato per un UITableViewCell standard, e fare tutto il tuo disegno lì. Ottieni una cella della larghezza giusta ma devi disegnare correttamente gli angoli superiore e inferiore arrotondati. –

2

Ho notato anche questo problema. La mia soluzione è stata quella di ridurre le dimensioni delle celle della tabella (larghezza 300 anziché 320). Non è un'ottima soluzione, ma funziona bene.

Non credo che si possa eliminare gli inserimenti di visualizzazione tabella su base individuale quando si è in modalità "raggruppata". Potrei sbagliarmi però!

8

Ho avuto un sacco di problemi con le sottoclassi UITableViewCell, ma poi ho appena interrotto la sottoclasse. L'aggiunta di subviews alla proprietà contentView di un UITableViewCell sembra eseguire la stessa cosa in qualsiasi istanza che ho incontrato, quindi lo faccio semplicemente all'interno del mio UITableViewController.

Ecco un esempio che ha un titolo e un valore:

- (UITableViewCell *)tableView:(UITableView*)tableView 
     cellForRowAtIndexPath: (NSIndexPath*)indexPath 
{  
    static NSString* CellIdentifier = @"AccountDetailsCell"; 
    UILabel* mainLabel = nil; 
    UILabel* valueLabel = nil; 
    const CGFloat kAccountDetailFontSize = 14.0; 

    UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier: CellIdentifier]; 
    if (cell == nil) 
    { 
     cell = [[[UITableViewCell alloc] initWithStyle: UITableViewCellStyleDefault 
             reuseIdentifier: CellIdentifier] autorelease]; 
     cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 
     cell.selectionStyle = UITableViewCellSelectionStyleNone; 

     mainLabel = [[[UILabel alloc] initWithFrame:CGRectMake(10.0, 0.0, 150.0, 44.0)] autorelease]; 
     mainLabel.tag = MAINLABEL_TAG; 
     mainLabel.font = [UIFont boldSystemFontOfSize: kAccountDetailFontSize]; 
     mainLabel.textAlignment = UITextAlignmentLeft; 
     mainLabel.textColor = [UIColor darkGrayColor]; 
     mainLabel.autoresizingMask = UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleHeight; 
     mainLabel.backgroundColor = [UIColor clearColor]; 
     [cell.contentView addSubview: mainLabel]; 

     valueLabel = [[[UILabel alloc] initWithFrame: CGRectMake(150.0, 0.0, 150.0, 44.0)] autorelease]; 
     valueLabel.tag = VALUELABEL_TAG; 
     valueLabel.font = [UIFont boldSystemFontOfSize: kAccountDetailFontSize]; 
     valueLabel.textAlignment = UITextAlignmentRight; 
     valueLabel.textColor = [UIColor darkTextColor]; 
     valueLabel.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleHeight; 
     valueLabel.backgroundColor = [UIColor clearColor]; 
     [cell.contentView addSubview: valueLabel]; 
    } 
    else 
    { 
     mainLabel = (UILabel*)[cell.contentView viewWithTag: MAINLABEL_TAG]; 
     valueLabel = (UILabel*)[cell.contentView viewWithTag: VALUELABEL_TAG]; 
    } 

    mainLabel.text = (NSString*)kCellTitles[indexPath.section][indexPath.row]; 
    valueLabel.text = [self tableView: tableView valueLabelTextForRowAtIndexPath: indexPath]; 

    return cell; 
} 
+0

Sto scoprendo che questo approccio non è sufficiente per le mie esigenze.Ho una cella che ha un titolo a più righe e una descrizione a più righe e si autorizza automaticamente in base al testo contenuto nelle due etichette. Sto dimensionando le cose in (- void) layoutSubviews e ricordando di chiamare prima [super layoutSubviews], ma mi sembra che self.contentView non sia ancora ridimensionato fino a dopo questa chiamata, e quindi a volte le mie celle finiscono con l'altezza sbagliata. – Johnus

+0

Un buon metodo, ma se vuoi usare QuartzCore come l'ombra per le etichette, lo scorrimento sarà lento e dovrai disegnare il cellulare da solo. – Alexander

+0

Da allora sono stato molto più felice con le sottoclassi in quanto molti dei problemi che ho avuto sono stati corretti negli SDK più recenti. Il mio metodo attuale prevede una sottoclasse con un metodo 'configureWithDataObject: (id) dataObject' che quindi sottoclassi per le mie celle personalizzate. Il mio controller di visualizzazione seleziona automaticamente la sottoclasse di celle corretta e chiama 'configureWithDataObject:'. Rende lo sviluppo veloce e facile (anche se è tecnicamente meno efficiente di fare tutto in codice statico). – jessecurry

9

Può la risposta essere semplice come prima convocazione [super layoutSubviews] all'interno metodo vostra UITableViewCell di sottoclasse layoutSubviews?

Ecco il mio codice.

prima cosa creare il UITextField e inserirlo al contentView nel metodo initWithStyle::

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier 
{ 
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; 
    if (self) { 
     inputField = [[UITextField alloc] initWithFrame:CGRectZero]; 
     [self.contentView addSubview:inputField]; 
     inputField.borderStyle = UITextBorderStyleLine; 
     [inputField release]; 
    } 
    return self; 
} 

Poi nel layoutSubviews, ho questo:

-(void)layoutSubviews 
{ 
    inputField.frame = CGRectMake(5, 5, 100, 20); 
} 

Con questo codice, il testo il campo è 5px a sinistra dello schermo, che è, ovviamente, 5px a sinistra della cella della tabella quando è in modalità raggruppata. In altre parole, ESTERNO della cella di visualizzazione tabella. Non buono.

Utilizzare questo codice e l'inputField è posto 5px alla destra della cella, come voglio che sia:

-(void)layoutSubviews 
{ 
    [super layoutSubviews]; // the magic line 
    inputField.frame = CGRectMake(5, 5, 100, 20); 
} 

ho potuto avere totalmente frainteso il problema si dovesse avere, però!

Erik

+0

Come potrei mancarlo? !! Grazie mille per la linea magica! – nonamelive