0

我正在创建一个带有默认图像的 PFImageView。然后我在后台加载图像,当图像完成从服务器下载后,它会立即显示并替换占位符/默认图像。问题是从默认图像到下载图像的过渡不是很愉快。有没有办法创建淡出默认并淡入下载的动画?

这是我的代码。

// set the pfImageView into the webView
_pfImageView = [[PFImageView alloc] initWithImage:[UIImage imageNamed:[NSString stringWithFormat:@"%dpTall.jpg", [self.drink.glassId intValue]]]];
_pfImageView.frame = CGRectMake(244, 0, 76, 114);
[webView.scrollView addSubview:_pfImageView];

// create a query for finding images on Parse
PFQuery *query = [PFQuery queryWithClassName:@"Images"];
[query whereKey:@"drinkId" equalTo:[NSNumber numberWithInt:self.drink.primaryKey]];

    [query getFirstObjectInBackgroundWithBlock:^(PFObject *object, NSError *error) {

    if (!error) {
        PFFile *imageFile = [object objectForKey:@"image"];
        _pfImageView.file = imageFile;
        [_pfImageView loadInBackground];

    } else {
        NSLog(@"PFQuery Error:%@", [error localizedDescription]);
    }
}];

谢谢

4

2 回答 2

3

我在 PFImageView 上有一个类别,可以在每次出现图像时获得交叉淡入淡出动画:

@implementation PFImageView (Utility)

// Add a fade animation to images
-(void) setImage:(UIImage *)image {
    if ([self.layer animationForKey:KEY_FADE_ANIMATION] == nil) {
        CABasicAnimation *crossFade = [CABasicAnimation animationWithKeyPath:@"contents"];
        crossFade.duration = 0.6;
        crossFade.fromValue  = (__bridge id)(self.image.CGImage);
        crossFade.toValue = (__bridge id)(image.CGImage);
        crossFade.removedOnCompletion = NO;
        [self.layer addAnimation:crossFade forKey:KEY_FADE_ANIMATION];
    }

    [super setImage:image];
}

@end

您只需要一个占位符图像,这样动画就可以第一次出现。

于 2014-02-12T09:59:54.400 回答
0

在我看来,我认为放弃对 PFImageView 的依赖并只使用普通的 UIImageView 并首先使用占位符设置它会更容易,就像你目前正在做的那样。然后在从 IF 语句开始的 getFirstObjectInBackgroundWithBlock 完成块中执行类似的操作....

if(!error)
{
    PFFile *imageFile = [object objectForKey:@"image"];

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSData *data = [imageFile getData];

        if(data)
        {
            dispatch_async( dispatch_get_main_queue(), ^{ 

                [UIView animateWithDuration:2.0 
                animations:^{ 
                    //imageView is your UIImageView you are trying to set/change
                    imageView.alpha = 0.0f;
                } 
                completion:^(BOOL finished){
                    [UIView animateWithDuration:2.0
                    animations:^{ 
                        imageView.image = [UIImage imageWithData:data];
                        imageView.alpha = 1.0f;
                    } 
                    completion:^(BOOL finished)
                    {
                    }];  
                }];//outside block
            });
        }
        else
        {
           //no data error handling here
        }                

    });
else
{
    //error handling here
} 

披露:我不在编译器附近,所以我还没有运行这段代码。

您也可以不使用外部 dispatch_async 而是使用带有完成块的 imageFile getdata 方法调用(它在 parse.com 网站 API 上),然后将 if(data) 中的所有内容放入该块而不是异步块中制成。我只是习惯于这样做。

于 2013-04-12T19:59:41.593 回答