2010-07-28 19 views
13

Ho un codice che crea una cella di tabella con un cursore. È abbastanza semplice e si adatta bene all'iPhone. L'ho anonimato un po 'qui:Ridimensionamento automatico della larghezza del contenuto di UITableViewCell

UITableViewCell* cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Foo"] autorelease]; 
cell.selectionStyle = UITableViewCellSelectionStyleNone; 
CGRect contentViewFrame = cell.contentView.frame; 
CGRect sliderFrame = CGRectMake(10, 0, 280, contentViewFrame.size.height); 
UISlider* slider = [[UISlider alloc] initWithFrame:sliderFrame]; 
UIImage* minimumImage = [UIImage imageNamed:@"min.png"]; 
UIImage* maximumImage = [UIImage imageNamed:@"max.png"]; 
slider.minimumValueImage = minimumImage; 
slider.maximumValueImage = maximumImage; 
slider.value = 0.5f; 
[slider addTarget:self action:@selector(sliderAction:) forControlEvents:UIControlEventValueChanged]; 
[cell.contentView addSubview:slider]; 
[slider release]; 

Naturalmente, questo è dimensionato erroneamente per l'iPad. Quindi il mio primo pensiero è stato quello di impostare la proprietà autoresizingMask su UIViewAutoresizingFlexibleWidth. Problema risolto, giusto? No. Ora su iPhone, la larghezza del contenuto di slider-plus-images è inferiore a 280 e quindi non va fino alla fine, ma finisce per circa 20 pixel.

Sull'iPad, la stessa cosa: la larghezza dello UISlider viene ridimensionata automaticamente a circa 20 pixel dalla fine della cella.

Forse il flag di ridimensionamento automatico sta prestando attenzione all'inesistente accessoryView della cella? Ho provato a impostarlo su nil in modo esplicito, ma penso che sia nil per impostazione predefinita, quindi non è cambiato nulla.

Mi piacerebbe che il contenuto di questa cella ridimensionasse automaticamente per essere la "piena" larghezza della cella, indipendentemente dal dispositivo e dall'orientamento. C'è un modo semplice per farlo?

risposta

3

Dovresti essere in grado di dire al sistema di ridimensionamento di "attaccare" l'oggetto ad una distanza fissa dal bordo destro (dove non sta ridimensionando abbastanza). Se si sperimenta con IB, è possibile creare una vista che ridimensiona in larghezza ed è fissata sul lato destro.

Avete impostato anche UIViewAutoresizingFlexibleRightMargin?

+0

Non ho impostato 'UIViewAutoresizingFlexibleRightMargin'. Puoi spiegare un po 'di più come fare questo programmaticamente? Il codice pubblicato sopra è anonimizzato ma è esattamente ciò che ho ora. –

10

Funziona esattamente come descritto. Sono propenso a pensare che sia un bug iOS. Su iPAD quando crei nuovo UITableViewCell la sua larghezza impostata per 320. hardcoded (!) Sia view che contentView. Non viene ridimensionato correttamente se impostato su UIViewAutoresizingFlexibleWidth. Avevo impostato su view.frame.size.width/2 con risultati divertenti: su iPhone è 160, su iPad è 608 !!!

Ho finito per ridimensionare manualmente le mie celle e il loro contenuto.

+1

Sì, sembra che sia sempre 320 quando viene creato per la prima volta – onmyway133

+0

Non è un bug, il 'contentMode' è semplicemente sbagliato. vedi sotto. –

6

Bit in ritardo ma ho trovato la soluzione della stessa domanda oggi, ma è necessario creare un UITableViewCell personalizzato. Quindi è possibile sovrascrivere la funzione

- (void) layoutSubviews 
{ 
    [dateLabel setFrame:CGRectMake(10.f, 16.f, 80.f, 12.f)]; 
    [textLabel setFrame:CGRectMake(106.f, 16.f, contentView.frame.size.width-105.f + 1.f, 12.f)]; 
} 

In tale funzione il self.frame.size.width è quello attuale.
E funziona anche con la rotazione del dispositivo.

+0

Non è necessario impostare manualmente i riquadri delle sottoview. Devi solo chiamare '[super layoutSubviews];' lì, ciò renderà automaticamente le subviews autorizzate. – Hlung

+1

Se lo fai, se hai subview personalizzati (nella tua cella personalizzata) –

+1

su layoutSubviews, lo stato dei documenti "Non dovresti chiamare questo metodo direttamente". Chiama invece setNeedsLayout –

3

Imposta il numero di telefono contentMode a UIViewContentModeRedraw.

+0

Ha fatto il trucco per me – Jasper

Problemi correlati