2012-04-10 7 views
7

Ich erhalte die URL des Bildes zur Laufzeit und möchte sie herunterladen & Diese Bilder in einer Tabelle anzeigen. Bilder werden asynchron heruntergeladen. Was wichtiger ist, ist, dass ich alle diese Bilder mit ihren tatsächlichen Größen anzeigen möchte.Ändern Sie die Größe der Tabellenzelle entsprechend der Höhe des heruntergeladenen Bildes

Bitte helfen Sie mir. Vielen Dank im Voraus :)

+0

ein paar Fragen für ya Mann. Werden diese Bilder die gesamte Breite des Bildschirms von 320 Pixel einnehmen? oder werden sie nur unter der anderen angezeigt, unabhängig von der Breite? Oder wenn die Breite des vorherigen Bilds kleiner als 320 ist und die nächste Breite auch in die verbleibende Breite passt (320-prev_img_width), wird diese neben dem vorherigen Bild oder unterhalb des vorherigen Bildes angezeigt. –

Antwort

2

Check out heightForRowAtIndexPath:. Hier ist ein weiterer post darüber.

1

für die u haben benutzerdefinierte UITableViewCell schaffen und u können die Größe der Tabellenansicht Zelle einstellen Höhe nach Bild mit diesem Code

-(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; 
} 

jetzt erhöhen Sie Ihre Tabelle Zelle Höhe

+1

Was Sie sagen, ist richtig. Aber um Bild in Zelle der Tabellenansicht herunterzuladen und anzuzeigen, verwende ich Asynchrone Ansichtsklasse. Ich übergebe Bild-URL an diese Klasse (Asynchronous View-Klasse) zum Herunterladen. Ich werde die tatsächliche Bildgröße erst erhalten, nachdem ich das Bild heruntergeladen habe. Also, wie kann ich tableview neuladen und die entsprechende Zelle der Bildgröße machen. – rahul

+1

Suche nur SO: http://Stackoverflow.com/a/4448393/207616 –

+1

relikd ist richtig. reloadRowsAtIndexPaths ist der Schlüssel. –

0

Wenn asynchrone Herunterladen ist ist Ihr echtes Problem, beziehen Sie sich auf AFNetworking Bibliothek UIImageView Kategorie. Vor allem diese Funktion:

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

Sie können diese UIimageview-Kategorie in Ihr Projekt aufnehmen und Zellbilder festlegen, die von dieser Klasse abgeleitet sind.

3

Auf der Delegatmethode Sie das Bild aktualisieren, wenn Sie

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

Dies wiederum rufen

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

So sollten Sie es die Höhe des Bildes benutzen würde, kann das Herunterladen abgeschlossen haben, wenn es vorhanden ist , eine Standardhöhe oder ein Platzhalterbild, wenn Sie eines haben.

3

Zunächst einmal würde ich sehr empfehlen, SDWebImage für das asynchrone Herunterladen zu verwenden, wenn Sie nicht bereits tun. Je nachdem, was Sie wollen, können Sie Bilder im Speicher oder auf der Festplatte zwischenspeichern - letzteres geschieht in der richtigen Weise, indem Sie sie im speziellen Cache-Ordner speichern, damit iOS sie löschen kann, wenn der Speicherplatz knapp wird. Es bietet auch eine praktische Kategorie in UIImageView, ähnlich wie AFNetworking, aber mit mehr Optionen und einem optionalen Abschlussblock. So können Sie etwas tun können:

#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; 
} 

diese Weise können Sie laden Sie das Bild asynchron, stellen Sie das richtige UIImageView, aber Sie verwenden auch den Block das Bild in einem NSMutableArray zu speichern, so dass Sie die Tableview sagen kann, die korrekte Höhe. Es teilt der Tabellenansicht außerdem mit, dass die Höhe der Zelle, deren Bild geladen wurde, aktualisiert wird. Dann, wenn die Tabellenansicht wissen muss, wie hoch eine gegebene Zelle ist, wenn das Bild geladen ist, werden wir die Größe von ihm bekommen:

- (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; 
    } 
} 

diese Weise können wir die Höhe sogar von Bildern kennen, die ausgeschaltet sind (zB wenn Sie nach unten gescrollt haben). Bei dieser Lösung wird davon ausgegangen, dass Sie NSMutableArray mit NSNull-Werten füllen, die beim Laden durch die Images ersetzt werden. Schließlich, wenn Sie möchten, können Sie SDWebImageManager verwenden, um die Downloads manuell zu starten, noch bevor die Zellen angezeigt werden.

+0

warum bekommst du diese +50 ?? – Rajneesh071

+0

Ich stimme zu SDWebImage ist eine großartige Bibliothek, aber es sollte nicht die richtige Antwort auf diese Frage sein, es sollte Stimmen bekommen, aber nicht die Kopfgeldpunkte. –

3

Sie können Ihre UIImageView Größe nach Bild herunterladen, aber wird es schlecht aussehen geben.So

Ich schlage vor, Sie alle Ihre Bild von gleicher Größe zu machen, so wird es in Ordnung und süß aussehen werden

Sie das alles Ihr Bild von gleicher Größe vornehmen können.

+ (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; 
} 

Aber wenn Sie wirklich Tabelle mit Größe andere Zeile zeigen wollen, dann Ihre Zeilengröße

auf Laufzeit machen ändern, wenn Sie Bild erhalten dann Ihr Bild im Wörterbuch mit Schlüsselwert speichern ist indexPath der Reihe .

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

und laden Sie dann Ihre Tabellenzeile neu.

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

Es wird Ihre Zeilenhöhe ändern

-(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; 
    } 
} 
Verwandte Themen