2011-12-20 18 views
21

Ho un UITableView abbastanza vanigliato nella mia app utilizzata per visualizzare un'immagine e un testo nel modo standard/predefinito. La prima volta che viene richiesto UITableViewCell, lo restituisco con un'immagine segnaposto e avvio un download asincrono dell'immagine reale. Al termine del download sostituisco l'immagine segnaposto.UIImageView nel mio UITableViewCell cambia dimensione al clic

Se un download non riesce, l'immagine segnaposto rimane. Cliccando su una tale riga agisce normalmente. Se il download ha esito positivo, facendo clic su una riga con l'immagine desiderata, l'UIImageView si espande fino all'altezza della riga (e la larghezza aumenta con la scala). UIImageView non ritorna mai alle dimensioni normali. I grezzi tentativi di impostare il frame di UIImageView non alleggeriscono il problema del misterioso ridimensionamento.

// from my - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath; method 
// after boilerplate cell dequeuing code 
cell.textLabel.text = [selectedNoun title]; 

// add placeholder image 
UIImage *placeholderImage = [UIImage imageNamed:@"placeholder.png"]; 
cell.imageView.image = placeholderImage; 
[cell.imageView setContentMode:UIViewContentModeScaleAspectFit]; 
//... 
// If the image has been downloaded I set it 
cell.imageView.image = iconDownloader.image; 

Questo mi sta facendo impazzire. In realtà accade solo in una delle due tabelle della mia app, ma dopo aver confrontato la linea o la linea non riesco a vedere alcuna differenza. Sperando che qualcuno si sia imbattuto in questo prima.

Grazie!

EDIT: Non ho una buona spiegazione per la mia soluzione se non per dire che le immagini di una certa dimensione sembrano portare a questo comportamento e l'uso di miniature reali (anche immagini un po 'più grandi della cornice di UIImageView) non esibire questo comportamento.

+1

Se si dispone di UITableViewCell personalizzato, assicurarsi che UIImageView non abbia un nome con "imageView" – kalpeshdeo

risposta

10

Le uniche cose che vengono in mente in tal senso l'aspetto dimensioni & di una vista all'interno del suo superview sono:

  1. stai cambiando le proprietà telaio/Bounds/Centro da qualche parte? Dove/come viene inizialmente impostato il frame?

  2. imageView.autoResizingMask deve essere impostato su UIViewAutoResizingNone

  3. imageView.clipsToBounds deve essere impostato su YES

EDIT: più suggerimenti

Sono riprese al buio b/c il codice inviato sembra buono e se hai impostato imageView.clipsToBounds che dovrebbe vincolare l'immagine disegnata al frame imageView. Qui ci sono un altro paio di cose da provare:

  1. Implementare tableView:willDisplayCell:forRowAtIndexPath: e impostare le proprietà imageView lì. Se il problema è imageView.frame, probabilmente non lo risolverà.

  2. Aggiungi il tuo UIImageView alla cella configurata come desideri e non utilizzare la proprietà integrata imageView. Se il comportamento della cella predefinita sta causando il problema, questo dovrebbe funzionare.

EDIT: grandi problemi di immagine

Non so esattamente quanto grande i "veramente grandi immagini" sono che si sta utilizzando, ma sono probabilmente il problema.Dalle UIImage docs (corsivo è mio):

Si dovrebbe evitare di creare oggetti UIImage che sono maggiori di 1024 x 1024 in termini di dimensioni. Oltre alla grande quantità di memoria tale immagine sarebbe consumare, si può incorrere in problemi quando si utilizza l'immagine come una texture in OpenGL ES o quando si disegna l'immagine per una vista o strato di. Questa limitazione di dimensioni non è applicabile se si eseguono manipolazioni basate su codice , ad esempio il ridimensionamento di un'immagine più grande di 1024 x 1024 pixel disegnandolo in un contesto grafico con bitmap. In effetti, è possibile che sia necessario ridimensionare un'immagine in questo modo (oppure suddividerla in più immagini più piccole) per disegnarla in una delle tue visualizzazioni.

+0

No Non sto cambiando il frame/bounds/center ovunque. Come è stato impostato inizialmente non sono sicuro. Ho aggiunto i suggerimenti da 2 e 3 ma senza risultati. –

+0

Ho il sospetto che abbia a che fare con il fatto che le immagini che sto mettendo in tavola con il problema sono davvero grandi mentre le immagini nella tabella senza il problema sono miniature reali. –

+0

che non dovrebbe importare b/c hai impostato 'contentMode' per adattarli ai limiti di' imageView' e hai impostato 'clipToBounds' per assicurarti che' imageView' non disegna nulla al di fuori dei suoi limiti, indipendentemente . Se stai usando una cella standard (vs personalizzata), allora il frame 'imageView' è configurato per te. È possibile inserire più codice che mostra l'istanza/configurazione della cella e il gestore scaricato dell'immagine. Potrebbe anche essere qualcosa in un metodo delegato 'tableView'. Per inciso, se le immagini scaricate sono molto grandi probabilmente dovresti ridimensionarle per la visualizzazione per risparmiare risorse. – XJones

0

Questo è piuttosto improbabile, ma si dovrebbe cercare di guardare in ciò che accade ai fotogrammi di subviews del UITableViewCell quando i suoi isSelected interruttori di proprietà da NO a YES (vale a dire che cosa accade quando si tocca una cella). Dubito che sarà di grande aiuto, ma vale la pena esaminare (se riesci a trovare qualcosa ... è tutto sotto il cofano di UITableViewCell che immagino).

Si dovrebbe anche esaminare la proprietà clipsToBounds di imageview. Forse ha qualcosa a che fare con questo?

1

In queste situazioni utilizzo questo framework di caricatore di immagini. Include un metodo per impostare un'immagine segnaposto di tua scelta, mentre scarichi le immagini in background e, come ulteriore vantaggio, le cache delle immagini che garantiscono la stessa immagine non dovranno mai essere scaricate due volte. È un grande lavoro che ho trovato molto utile per il caricamento delle immagini tableview.

SDWebImage: https://github.com/rs/SDWebImage

+0

Sto usando un modello simile. Grazie. –

1

ho avuto lo stesso problema, e non ho capire il motivo di tale. In ogni caso, è qualcosa di correlato all'immagine segnaposto: se si carica un'immagine della stessa dimensione del segnaposto, non verrà eseguito alcun ridimensionamento, ma se le dimensioni non corrispondono, l'immagine caricata verrà ridimensionata alle dimensioni del segnaposto e ridimensionato di nuovo quando cliccato.

Quindi, se si desidera evitare il problema, utilizzare un segnaposto che corrisponda all'altezza della riga.

0

fare qualcosa di simile

CGRect bounds = [self bounds]; 
[self setImage:image]; 
[self setBounds:bounds]; 

quando si imposta immagine risolve il problema per me

3

Il mio problema era leggermente diverso, ho avuto una consuetudine UITableViewCell con la propria UIImageView e quando cellule scomparve e riapparve, l'immagine sarebbe avere dimensioni errate Il mio problema era che stavo installando cell.imageView a cell.thumbnail (immagine personalizzata) un luogo e in un altro, così ho cambiato tutti i riferimenti a cell.thumbnail.

Speriamo che aiuta qualcuno in futuro con problema simile.

+0

Problema simile per me: assicurarmi che un 'UIImageView' personalizzato in una cella non fosse denominato 'imageView' (chiamato in' photoView') ha risolto il problema. Sto indovinando che 'imageView' standard viene caricato dinamicamente e aggiunto come sottoview una volta che si accede a quella proprietà .. – raheel

1

attenersi alla seguente procedura:

  1. Selezionare l'ImageView sul tuo cellulare personalizzato
  2. andare a Mostra di Identità ispettore
  3. Scorrere fino alla fine e deselezionare la casella "User Interaction Enabled" casella di controllo.
+0

questo ha funzionato per me. Grazie! – Nancy

+0

* sigh * in realtà no. È un problema intermittente per me. – Nancy

0

Se si ricarica la Tableview quando terminare il caricamento, l'immagine ottenere la dimensione che è stato supponiamo di avere

[self.tableview reloadData]; 
13

Se avete personalizzato UITableViewCell quindi assicurarsi che il vostro UIImageView non viene denominato con " imageView "

+1

Nel mio caso, avevo ancora una presa phantom ancora chiamata imageView che avevo bisogno di cancellare. –

+0

sorprendendo questo era il mio problema pure! Avevo cambiato il nome della presa, ma non l'ho mai cancellato completamente. Assicurati di controllare tutti i nomi degli outlet di UIImageView. Per qualsiasi ragione, averlo denominato imageView ridimensionato il mio UIImageView – Rickybobby

2

This answer mi ha aiutato. Ma ho dovuto fare in modo di chiamare [cell layoutSubviews] nel metodo che in realtà l'impostazione, in questo modo:

cell.imageView.image = image; 
[cell layoutSubviews]; 

Spero che questo può essere utile a voi!

+0

non chiamare mai layoutSubviews direttamente – tspentzas

+0

@ user1826261 Gradirei una spiegazione. Aiutami a capire. –

Problemi correlati