2012-04-10 19 views
7

Ricevo l'URL dell'immagine in fase di esecuzione e voglio scaricare & visualizzare queste immagini in una tabella. Le immagini verranno scaricate in modo asincrono. Ciò che è più importante è che voglio visualizzare tutte queste immagini con le loro dimensioni reali.Ridimensiona l'altezza della cella tabella come da altezza dell'immagine scaricata

Gentilmente aiutatemi. Grazie in anticipo :)

+0

Un paio di domande per ya uomo. Queste immagini occuperanno una larghezza dello schermo pari a 320 px? o saranno visualizzati solo sotto l'altro, indipendentemente dalla larghezza? Oppure se la larghezza dell'immagine precedente è inferiore a 320 e quella successiva può anche rientrare nella larghezza rimanente (320-prev_img_width), allora questa apparirà accanto all'immagine precedente o inferiore a quella precedente. –

risposta

2

Check out heightForRowAtIndexPath:. Ecco un altro post a riguardo.

1

per che u have per creare personalizzati UITableViewCell e la u può impostare la dimensione della tabella delle cellule vista utilizzando questo codice

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    int rowHeight =0.0f; 

    // here u can get particular Url by indexPath.row, now create UIImage object using that Url 

    CGRect bioHeadingFrame = image.frame; 
    rowHeight = size.height; //get the height of that image 

    return rowHeight; 
} 

ora l'altezza del tuo cellulare tabella viene aumento secondo l'altezza dell'immagine

+1

Ciò che dici è giusto. Ma per scaricare e visualizzare l'immagine nella cella di visualizzazione tabella, sto usando la classe View asincrona. Sto passando l'URL dell'immagine a questa classe (Asincrona View Class) per il download. Otterrò la dimensione effettiva dell'immagine solo dopo aver scaricato l'immagine. Quindi, come posso dire a tableview di ricaricare e fare la rispettiva cella della dimensione dell'immagine. – rahul

+1

basta cercare SO: http://stackoverflow.com/a/4448393/207616 –

+1

relikd è giusto. reloadRowsAtIndexPaths è la chiave. –

0

Se lo scaricamento asincrono è il tuo vero problema, fai riferimento alla categoria UIImageView della libreria AFNetworking. Soprattutto questa funzione:

- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholderImage 

È possibile includere questa categoria UIimageview nel progetto e impostare le immagini di cella derivate da tale classe.

3

Sul metodo delegato è necessario aggiornare l'immagine quando terminato il download è possibile utilizzare

[tableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:indexPath, nil] 
       withRowAnimation:UITableViewRowAnimationAutomatic]; 

Ciò chiamare di nuovo

-(CGFloat)tableView:(UITableView *)tableView 
heightForRowAtIndexPath:(NSIndexPath *)indexPath 

così si dovrebbe avere utilizzando l'altezza dell'immagine se esiste , un'altezza predefinita o un'immagine segnaposto se ne hai uno.

3

Prima di tutto, mi consiglia caldamente di utilizzare SDWebImage per il download asincrono, se non lo si sta già facendo. A seconda di ciò che si desidera, è possibile avere immagini cache in memoria o su disco - quest'ultimo viene eseguito nel modo corretto, salvandole nella cartella cache speciale, in modo che iOS possa eliminarle se esaurisce lo spazio. Fornisce anche una comoda categoria su UIImageView, simile a ciò che offre AFNetworking, ma con più opzioni e un blocco di completamento opzionale. In questo modo si può fare qualcosa di simile:

#import <SDWebImage/UIImageView+WebCache.h> 

... 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    // Create the cell... 

    [cell.myImageView setImageWithURL:[NSURL URLWithString:@"http://example.com/image.jpg"] 
       placeholderImage:[UIImage imageNamed:@"placeholder"] 
        completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType) { 
     if (image != nil) { 
      [self.images insertObject:image atIndex:indexPath.row]; 
      [tableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:indexPath, nil] withRowAnimation:YES]; 
     } 
    }]; 
    return cell; 
} 

In questo modo si scarica l'immagine in modo asincrono, impostare l'UIImageView correttamente, ma si utilizza anche il blocco per salvare l'immagine in un NSMutableArray, in modo da poter dire la Tableview la altezza corretta. Indica anche la vista tabella per aggiornare l'altezza della cella di cui è stata caricata l'immagine. Poi, quando la visualizzazione della tabella ha bisogno di sapere quanto in alto una determinata cella è, se l'immagine è stata caricata, otterremo la dimensione da esso:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 
    id image = [self.images objectAtIndex:indexPath.row]; 
    if ([image isKindOfClass:[NSNull class]]) { 
     return defaultHeight; 
    } else { 
     return [image size].height + topPadding + bottomPadding; 
    } 
} 

In questo modo sappiamo che l'altezza anche di immagini che sono off schermo (ad esempio quando si scorre verso il basso). Questa soluzione presuppone che si inizi a popolare NSMutableArray con valori NSNull, che vengono quindi sostituiti con le immagini quando vengono caricati. Infine, se lo desideri, puoi utilizzare SDWebImageManager per avviare manualmente i download anche prima che vengano visualizzate le celle.

+0

perché ottieni questo +50 ?? – Rajneesh071

+0

Sono d'accordo. SDWebImage è una grande libreria ma non dovrebbe essere la risposta giusta a questa domanda, dovrebbe aver ottenuto voti sicuri ma non i punti di merito. –

3

È possibile effettuare la vostra dimensione UIImageView come per il download dell'immagine ma darà un aspetto brutto.

Quindi suggerisco di effettuare tutta la vostra immagine della stessa dimensione, quindi sarà look raffinato e dolce

è possibile utilizzare questo per fare tutta la vostra immagine della stessa dimensione.

+ (UIImage *)imageScaledToSizeWithImage:(UIImage *)imagewww andsizeee:(CGSize)size 
{ 
    //avoid redundant drawing 
    if (CGSizeEqualToSize(imagewww.size, size)) 
    { 
     return imagewww; 
    } 

    //create drawing context 
    UIGraphicsBeginImageContextWithOptions(size, NO, 0.0f); 

    //draw 
    [imagewww drawInRect:CGRectMake(0.0f, 0.0f, size.width, size.height)]; 

    //capture resultant image 
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    //return image 
    return image; 
} 

Ma se si vuole veramente dimostrare tavolo con diverse dimensioni di fila poi fare cambiare la dimensione riga sul tempo di esecuzione

quando si otterrà un'immagine quindi salvare la vostra immagine nel dizionario con il valore chiave è indexPath di fila .

[tableImageDict setObject:image forKey:[NSString stringWithFormat:@"%i,%i",indexPath.row,indexPath.section]]; 

e quindi ricaricare la riga della tabella.

[table reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] 
        withRowAnimation:UITableViewRowAnimationNone]; 

che cambierà la vostra altezza delle righe

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UIImage *image = (UIImage *)[tableImageDict objectForKey: 
           [NSString stringWithFormat:@"%i,%i", 
            indexPath.row,indexPath.section]]; 


    if (image != nil) 
    { 
     return image.size.height; 
    } 
    else{ 
     return 44.0; 
    } 
} 
Problemi correlati