【问题标题】:UIImageView+AFNetworking setImageWithURL with animationUIImageView+AFNetworking setImageWithURL 带动画
【发布时间】:2013-07-18 17:23:43
【问题描述】:

使用 AFNetworking,从服务器下载图像并放入 UIImageView 非常简单:

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

如果我想用效果(可能会褪色)替换图像呢?

因为我想用很多图片制作幻灯片。

【问题讨论】:

    标签: objective-c uiimageview afnetworking


    【解决方案1】:

    您可以将animateWithDuration 与提供success 块的setImageWithURL 的再现结合使用,例如

    [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];
    

    或者,如果您的占位符图像不是空白,您可能希望通过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];
    

    更新:

    顺便说一句,如果您担心图像视图(如果您引用 self,视图或视图控制器)在下载完成之前会一直保留,您可以:

    __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];
    

    即使您这样做了,图像视图也会一直保留到下载完成,因此您也可以选择在视图控制器的 dealloc 方法中取消任何正在进行的下载:

    - (void)dealloc
    {
        // if MRC, call [super dealloc], too
    
        [_imageView cancelImageRequestOperation];
    }
    

    【讨论】:

    • 不过,请注意保留周期。
    • @MarceloFabri 你能详细说明一下吗?哪个保留周期?
    • Rob,你知道是否可以为加载制作淡入淡出效果。我的意思是:0% 加载 = 不透明度 0.0,100% 加载 - 不透明度 1.0
    • @timpone 这确实会在下载期间保留图像视图(如果您指的是self,控制器也是如此)。不过,我不会将其称为保留循环,因为当它完成时,循环引用被解析并且所有内容都被释放。不幸的是,AFNetworking 无论如何都会在下载检索期间保留图像视图,因此弱引用的常用技巧无法解决此问题。您只需要忍受“下载期间保留”行为,或者转到更强大的UIImageView 类别。就我个人而言,我不会出汗。
    • @DanielCampos 简短回答:并非如此。长答案:这个想法有两个问题。首先,UIImageView 类别不提供progress 块,因此您必须求助于AFImageRequestOperation(在其中您会失去一些很棒的UIImageView 类别好处)。更糟糕的是,即使您做了很多工作来实现这一点,虽然您可以在下载期间淡出占位符图像,但在下载整个图像之前您无法开始淡入新图像。
    【解决方案2】:

    当在线请求成功完成时,尝试将 imageView 的 alpha 从 0 变为 1:

    // 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     
                       }
    

    当然,您可以在完成块中使用您喜欢的任何其他动画!

    【讨论】:

    • 别忘了在成功块中设置weakImageView.image为image!
    猜你喜欢
    • 1970-01-01
    • 2014-12-19
    • 1970-01-01
    • 2018-06-16
    • 1970-01-01
    • 1970-01-01
    • 2012-05-13
    相关资源
    最近更新 更多