3 Stimmen

Größenbeschränkung in UIImageView?

Ich versuche, ein ziemlich großes Bild in einem UIImageView anzuzeigen. Das Bild wird korrekt heruntergeladen (mit einer NSSessionDownloadTask) und ich kann ein UIImage daraus erstellen, aber nichts wird im UIImageView angezeigt. Es erscheinen keine Speicherwarnungen oder Fehlermeldungen. Weiß jemand, was los ist?

-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location
{  
    UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:location]];
    self.imageView.image = image;
    self.progressView.progress = 0.0f;
    [self.activityView stopAnimating];
    [self.activityView setHidden:YES];

    NSLog(@"Vollständiges Bild erhalten!"];
}

5voto

dandan78 Punkte 12833

Ihr Bild hat gerade den Chrome-Tab zum Absturz gebracht, als ich versuchte, es auf einem 4GB-Laptop anzuzeigen. Es hat auch meinen Laptop ziemlich zum Stottern gebracht, bevor es gespeichert wurde.

Es handelt sich um ein 36MB großes JPEG-komprimiertes Bitmap. 18K x 18K Pixel. Lass uns etwas Mathe machen.

Bei der Auflösung haben Sie insgesamt 324000000 Pixel. 324M Pixel. Jedes wird durch 3 Byte Farbinformation im Speicher dargestellt. Eine gute Annäherung wäre dann insgesamt 1GB an Rohpixel-Daten. Und ich bin mir nicht sicher, ob das berücksichtigt, wie eine UIImage-Instanz das intern speichert.

Angesichts des oben Gesagten und der Tatsache, dass die neuesten (und leistungsstarken) iOS-Geräte insgesamt 1GB RAM haben, denke ich, dass es sicher wäre zu sagen, dass das Bild selbst dann zu groß ist, wenn kein inhärentes Größenlimit vorhanden ist.

2voto

Andrea Sprega Punkte 2191

Ich denke, Sie versuchen, den Inhalt Ihres imageView von einem Hintergrundthread aus einzustellen. Alle UI-Updates müssen vom Hauptthread (Hauptwarteschlange) ausgeführt werden, um sicher zu sein. Versuchen Sie, die image-Eigenschaft des UIImageView auf Ihrer Hauptwarteschlange zu setzen, indem Sie Folgendes tun:

-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location
{  
    UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:location]];
    dispatch_async(dispatch_get_main_queue(), ^{
        self.imageView.image = image;
        self.progressView.progress = 0.0f;
        [self.activityView stopAnimating];
        [self.activityView setHidden:YES];
    });

    NSLog(@"Vollständiges Bild erhalten!"];
}

BEARBEITEN: Was ich oben geschrieben habe, bleibt wahr, aber wie dandan78 darauf hingewiesen hat, ist Ihr Bild ziemlich groß und die obige Lösung wird Ihr Problem wahrscheinlich nicht beheben, da Sie die de facto Speicherbeschränkungen nicht überwinden können.

0voto

Kirsteins Punkte 26439

Stellen Sie sicher, dass Sie sich im Hauptthread befinden. Das UI kann nicht vom nicht-Hauptthread geändert werden. Sie können verwenden

[self.imageView performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:NO];

um sicherzustellen, dass.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X