2013-07-18 15 views
22

Z AFNetworking, jest bardzo proste, aby pobrać obraz z serwera i umieścić w UIImageView:UIImageView + AFNetworking setImageWithURL z animacją

[imageView setImageWithURL:[NSURL URLWithString:@"http://i.imgur.com/r4uwx.jpg"] placeholderImage:[UIImage imageNamed:@"placeholder-avatar"]]; 

Jak o tym, czy chcę zrobić to zastąpienie obrazu z efektem (może znikną) ???

To dlatego, że chcę zrobić pokaz slajdów z dużą ilością zdjęć.

Odpowiedz

45

Można użyć animateWithDuration w połączeniu z wersją setImageWithURL, która dostarcza blok success, np.

[imageView setImageWithURL:[NSURL URLWithString:@"http://i.imgur.com/r4uwx.jpg"] 
      placeholderImage:[UIImage imageNamed:@"placeholder-avatar"] 
        success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) { 
         self.imageView.alpha = 0.0; 
         self.imageView.image = image; 
         [UIView animateWithDuration:0.25 
             animations:^{ 
              self.imageView.alpha = 1.0; 
             }]; 
        } 
        failure:NULL]; 

Lub, jeśli obraz zastępczy nie jest pusty, to prawdopodobnie chcą przejechać rozpuścić poprzez transitionWithView:

[imageView setImageWithURL:[NSURL URLWithString:@"http://i.imgur.com/r4uwx.jpg"] 
      placeholderImage:[UIImage imageNamed:@"placeholder-avatar"] 
        success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) { 
         [UIView transitionWithView:self.imageView 
             duration:0.3 
              options:UIViewAnimationOptionTransitionCrossDissolve 
             animations:^{ 
              self.imageView.image = image; 
             } 
             completion:NULL]; 
        } 
        failure:NULL]; 

Aktualizacja:

Nawiasem mówiąc, jeśli "niepokoi fakt, że widok obrazu (i jeśli odnosisz się do self, widok lub kontroler widoku) jest zachowywany aż do zakończenia pobierania, możesz:

__weak UIImageView *weakImageView = self.imageView; 
[imageView setImageWithURL:[NSURL URLWithString:@"http://i.imgur.com/r4uwx.jpg"] 
      placeholderImage:[UIImage imageNamed:@"placeholder-avatar"] 
        success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) { 
         UIImageView *strongImageView = weakImageView; // make local strong reference to protect against race conditions 
         if (!strongImageView) return; 

         [UIView transitionWithView:strongImageView 
             duration:0.3 
              options:UIViewAnimationOptionTransitionCrossDissolve 
             animations:^{ 
              strongImageView.image = image; 
             } 
             completion:NULL]; 
        } 
        failure:NULL]; 

Nawet jeśli to zrobisz, widok obrazu jest zachowana aż zakończeniu pobierania, więc można ewentualnie także anulować pobieranie w toku w metodzie dealloc kontrolera widoku:

- (void)dealloc 
{ 
    // if MRC, call [super dealloc], too 

    [_imageView cancelImageRequestOperation]; 
} 
+0

Należy jednak zachować ostrożność przy cyklach zatrzymywania. –

+0

@MarceloFabri mógłbyś rozwinąć. Które zatrzymują cykl? – timpone

+0

Rob, czy wiesz, czy jest możliwy efekt Zanikania podczas ładowania. Mam na myśli: 0% załadowane = krycie 0.0, 100% załadowane - krycie 1.0 –

3

Spróbuj animowanie alfa ImageView od 0 do 1, gdy wniosek on-line zakończy się sukcesem:

// You should not call an ivar from a block (so get a weak reference to the imageView) 
__weak UIImageView *weakImageView = self.imageView; 

// The AFNetworking method to call 
[imageView setImageWithURLRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://host.com/image1.png"]] placeholderImage:nil] 
        success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image){ 
        // Here you can animate the alpha of the imageview from 0.0 to 1.0 in 0.3 seconds 
        [weakImageView setAlpha:0.0]; 
        [UIView beginAnimations:nil context:NULL]; 
        [UIView setAnimationDuration:0.3]; 
        [weakImageView setAlpha:1.0]; 
        [UIView commitAnimations]; 
        } 
        failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error){ 
        // Your failure handle code  
        } 

Oczywiście można użyć dowolnego innego animację chcesz wewnątrz bloku zakończenia!

+0

Nie zapomnij ustawić weakImageView.image do obrazu w bloku sukcesu! – CyberDandy