2012-03-24 14 views
2

Ich habe ein ImageView in einem ScrollView eingebettet. Das ImageView muss aus dem Internet heruntergeladen werden (über flickr api), also füge ich einen Thread hinzu, um das zu handhaben. Aber was soll ich tun, nachdem ich das Bild heruntergeladen habe? Wie kann ich mein ImageView neu laden? Hier ist mein Code.So laden Sie meine Ansicht in iOS

In der Tat funktioniert es gut. aber die imageView-Größe ist (0, 0). Wie kann ich das beheben?

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    if (!self.myImage) 
    { 
     UIActivityIndicatorView* spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; 
     [spinner startAnimating]; 
     self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:spinner]; 
     dispatch_queue_t downloadQueue = dispatch_queue_create("flickr downloader (photo)", NULL); 
     dispatch_async(downloadQueue, ^{ 
      NSData* data = [NSData dataWithContentsOfURL:[FlickrFetcher urlForPhoto:self.photo format:FlickrPhotoFormatLarge]]; 
      dispatch_async(dispatch_get_main_queue(), ^{ 
       self.myImage = [UIImage imageWithData:data]; 
       [self.imageView setImage:self.myImage]; 
       [self viewDidLoad]; 
       [self viewWillAppear:NO]; 
       NSLog(@"imageViewSet!"); 
       self.navigationItem.rightBarButtonItem = nil; 
      }); 
     });  
     dispatch_release(downloadQueue); 
    } 
    else 
    { 
     NSString* imageTitle; 
     if ([[self.photo objectForKey:@"title"] length] > 0) 
      imageTitle = [self.photo objectForKey:@"title"]; 
     else if ([[self.photo valueForKeyPath:@"description._content"] length] > 0) 
      imageTitle = [self.photo valueForKeyPath:@"description._content"]; 
     else imageTitle = @"Unknown"; 
     [[self navigationItem] setTitle:imageTitle]; 
     self.scrollView.delegate = self; 
     self.scrollView.contentSize = self.imageView.image.size; 
    } 
} 

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView 
{ 
    return self.imageView; 
} 

- (void)viewWillAppear:(BOOL)animated 
{ 

    [super viewWillAppear:animated]; 
    double scale = self.imageView.bounds.size.width * 1.0/self.myImage.size.width; 
    if (scale > self.imageView.bounds.size.height * 1.0/self.myImage.size.height) 
     scale = self.imageView.bounds.size.height * 1.0/self.myImage.size.height; 
    NSLog(@"imgview%g, %g",self.imageView.bounds.size.width, self.imageView.bounds.size.height); 
    NSLog(@"img%g, %g",self.myImage.size.width, self.myImage.size.height); 
    self.imageView.frame = CGRectMake(0, 0, self.imageView.image.size.width, self.imageView.image.size.height); 
    [self.scrollView setZoomScale:scale]; 
} 
+0

Funktioniert es, wenn Sie auskommentieren 'dispatch_release (downloadQueue);'? Ich denke, dass Sie die Dispatch-Warteschlange freigeben, bevor der Block ausgeführt wird. – Costique

+0

versuchte das. funktioniert immer noch nicht .. – yoyosir

Antwort

1

Der üblicher Weg ist zu nennen:

[self.imageView setNeedsDisplay]; 

Edited hinzufügen:

ich einfach realisiert werden, sagte die Bildansicht noch ist (0,0). Von the docs:

Das Festlegen der Image-Eigenschaft ändert nicht die Größe eines UIImageView. Mit sizeToFit können Sie die Größe der Ansicht an das Bild anpassen.

+0

Ich habe das versucht. Ich habe [self viewWillAppear: NO] ersetzt; mit [self.imageView setNeedsDisplay]; aber es funktioniert nicht. – yoyosir

+0

Wird irgendetwas in die Konsole geschrieben? Sind Sie sicher, dass diese Zeile ausgeführt wird? Können Sie im Debugger darauf warten? – user1118321

+0

2012-03-24 14: 13: 49.451 TopPlaces [1511: f803] imgview320, 367 2012-03-24 14: 13: 49.452 TopPlaces [1511: f803] img0, 0 – yoyosir

Verwandte Themen