2013-01-13 12 views
13

Sto utilizzando la libreria AFNetworking per impostare le immagini con il contenuto degli URL. Nell'esempio seguente topLeftImage è un'istanza di UIImageView.Mostra UIActivityIndicator con AFNetworking SetImageWithURL

[topLeftImage setImageWithURL:[NSURL URLWithString:imageURL]]; 

Quello che mi piacerebbe fare è di mostrare un'UIActivityIndicatorView mentre l'immagine sta scaricando. Tuttavia non riesco a capire dove attivare l'avvio e l'arresto dell'indicatore di attività. Quello che segue è il mio codice per l'indicatore di attività.

UIActivityIndicatorView *activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; 
[topLeftImage addSubview:activityIndicator]; 
[activityIndicator startAnimating]; 

Come posso collegare il codice di cui sopra al metodo setImageWithURL in modo che indicatore di attività compare solo mentre l'immagine è il download?

risposta

37

UIImageView + AFNetworking.h offre un metodo setImageWithURL che consente di utilizzare i blocchi di successo e di errore. Questi blocchi verranno eseguiti una volta che la richiesta ha avuto esito positivo o negativo. In questo modo è possibile avviare l'animazione appena prima della richiesta e inserire il blocco in caso di esito positivo o negativo. Si tratta di un codice di esempio:

NSURL *imageURL = [NSURL URLWithString:@"http://upload.wikimedia.org/wikipedia/commons/thumb/e/ec/Mona_Lisa%2C_by_Leonardo_da_Vinci%2C_from_C2RMF_retouched.jpg/402px-Mona_Lisa%2C_by_Leonardo_da_Vinci%2C_from_C2RMF_retouched.jpg"]; 
NSURLRequest *imageRequest = [NSURLRequest requestWithURL:imageURL]; 
[_activityIndicator setHidden:NO]; 
[_activityIndicator startAnimating]; 
[_imageView setImageWithURLRequest:imageRequest 
        placeholderImage:nil 
          success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) 
{ 
    [_activityIndicator setHidden:YES]; 
    [_activityIndicator stopAnimating]; 
    _imageView.image = image; 
} 
          failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error) 
{ 
    [_activityIndicator setHidden:YES]; 
    [_activityIndicator stopAnimating]; 
}]; 
+0

Ho caricato un codice di esempio su GitHub. https://github.com/luisespinoza/ActivityIndicatorImageURL – LuisEspinoza

+0

sembra buono per me. – javiergov

+3

Attenzione ai cicli di mantenimento quando si fa riferimento ai blocchi self in –

1

Sulla base di LuisEspinoza risposta che ho fatto questa piccola categoria spero che può aiutare. Creo e aggiungo uno UIActivityIndicatorView se la vista non ha immagine.

#import <UIImageView+AFNetworking.h> 
@implementation UIImageView (LDToolbox) 
- (void)loadFromUrl:(NSURL *)url errorImage:(UIImage *)errorImage { 


    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 
    [request addValue:@"image/*" forHTTPHeaderField:@"Accept"]; 
    __weak UIImageView *weakSelf = self; // Always use weak in Blocks 

    [[self subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)]; // Remove previous that not stop 

    __block UIActivityIndicatorView *activityIndicator = [[UIActivityIndicatorView alloc] init]; 
    activityIndicator.frame = self.bounds; 
    [self addSubview:activityIndicator]; 
    [activityIndicator setHidden:NO]; 
    [activityIndicator startAnimating]; 


    void (^removeSpinner)(void) = ^{ // Desctuctor Block 
     if (activityIndicator) { 
      [activityIndicator setHidden:YES]; 
      [activityIndicator stopAnimating]; 
      [activityIndicator removeFromSuperview]; 
      activityIndicator = nil; 
     } 
    }; 

    [self setImageWithURLRequest:request placeholderImage:nil success: ^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) { 
     removeSpinner(); 
     weakSelf.image = image; 
    } failure: ^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error) { 
     removeSpinner(); 
     NSLog(@"failed loading [%@]: %@", url, error); 
     weakSelf.image = errorImage; 
    }]; 
}  
@end 
2

semplice extension per UIImageView a Swift:

extension UIImageView { 

    func setImageWithString(string: String?) { 

     if let string = string, let url = NSURL(string: string) { 

      let activityIndicatorView = UIActivityIndicatorView(frame: CGRectMake(0, 0, CGRectGetWidth(frame), CGRectGetHeight(frame))) 
      activityIndicatorView.hidden = false 
      activityIndicatorView.color = UIColor.lightGrayColor() 

      addSubview(activityIndicatorView) 
      bringSubviewToFront(activityIndicatorView) 

      activityIndicatorView.startAnimating() 

      setImageWithURLRequest(NSURLRequest(URL: url), placeholderImage: nil, success: { request, response, image in 

       self.image = image 
       activityIndicatorView.hidden = true 
       activityIndicatorView.stopAnimating() 
       activityIndicatorView.removeFromSuperview() 

       }, failure: { request, response, error in 

        activityIndicatorView.hidden = true 
        activityIndicatorView.stopAnimating() 
        activityIndicatorView.removeFromSuperview() 
      }) 
     } 
    } 
} 
Problemi correlati