2013-04-01 9 views
8

Un'applicazione contiene un UITableView contenente un UITableViewCell personalizzato. La cella a sua volta contiene un UIImageView.Perché UIImageView viene ridimensionato quando si assegna una nuova immagine in iOS 6?

Il problema è che modificando l'immagine in cellForRowAtIndexPath rende l'immagine occupa l'intera area UITableViewCell:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    CustomCell *cell = [self.tableView dequeueReusableCellWithIdentifier:@"CustomCell"]; 
    NSString *path = [[NSBundle mainBundle] pathForResource:@"bigrect" ofType:@"png"]; 
    UIImage *image = [[UIImage alloc] initWithContentsOfFile:path]; 

    cell.imageView.image = image; 

    return cell; 
} 

enter image description here

In IB, è stato selezionato 'Aspect Fit' come modalità, ma cambiare questo campo non ha alcun effetto apparente sul risultato.

Tuttavia, quando l'immagine è impostata da IB, senza chiamata a cell.imageView.image = immagine nel mio codice, il risultato è esattamente quello che mi piacerebbe vedere. L'immagine rimane entro i limiti che ho definito per l'UIImageView in IB e non tenta di scalare per adattare l'intera altezza verticale della UITableViewCell:

enter image description here

L'immagine che sto utilizzando è 1307x309 pixel, nel caso sia importante. I test sono stati eseguiti su simulatore iOS 6.1.

ho notato questo dal UIIMageView Documentation:

In iOS 6 e successivamente, se si assegna un valore alla proprietà restorationIdentifier di questa vista, si tenta di mantenere il telaio dell'immagine visualizzata. In particolare, la classe conserva i valori dei limiti, del centro e delle proprietà di trasformazione della vista e della proprietà anchorPoint del livello sottostante. Durante il ripristino, la vista dell'immagine ripristina questi valori in modo che l'immagine appaia esattamente come prima. Per ulteriori informazioni su come funziona la conservazione dello stato e il ripristino, consultare la Guida alla programmazione dell'app iOS.

Tuttavia, nulla qui o altrove nella documentazione che ho trovato ha risolto il problema. L'aggiunta di un "Restoration ID" di "Foo" a UIImageView in IB sotto "Identity" non modificava il comportamento. Deselezionando 'Usa Autolayout' anche non ha modificato il comportamento.

Come posso impedire a iOS di ridimensionare UIImageView in UITableViewCell quando si imposta l'immagine?

+0

perché non impostare il frame corretto della vista immagine dopo aver assegnato la proprietà dell'immagine? –

+0

@PatrickGoley, potrebbe essere l'ultima risorsa, suppongo. Preferirei davvero non avere a che fare con il layout manuale però. –

risposta

6

Si scopre che UITableViewCell apparentemente ha già una proprietà chiamata "imageView" che copre l'intero sfondo della cella. L'impostazione della proprietà immagine di questo oggetto ImageView set di immagini del sfondo, non l'immagine che mi interessava

Cambiare il mio metodo al seguente garantendo nel contempo che CustomCell ha una proprietà "myImageView" risolto il problema:.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    CustomCell *cell = [self.tableView dequeueReusableCellWithIdentifier:@"CustomCell"]; 
    NSString *path = [[NSBundle mainBundle] pathForResource:@"bigrect" ofType:@"png"]; 
    UIImage *image = [[UIImage alloc] initWithContentsOfFile:path]; 

    cell.myImageView.image = image; 

    return cell; 
} 

This SO answer a una domanda leggermente diversa mi ha indirizzato nella giusta direzione.

+2

Grazie mille! Stavo facendo lo stesso errore, non me ne sono reso conto e ho fatto il debug per ore! Così stressato, ma fortunato a trovare la tua risposta! – Zennichimaro

+0

è per questo che aggiungo sempre 'mio' prima di qualsiasi parola chiave .. –

Problemi correlati