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];
}
Funktioniert es, wenn Sie auskommentieren 'dispatch_release (downloadQueue);'? Ich denke, dass Sie die Dispatch-Warteschlange freigeben, bevor der Block ausgeführt wird. – Costique
versuchte das. funktioniert immer noch nicht .. – yoyosir