当图像设置为nil时,UIImageView不会重绘

时间:2012-08-20 21:01:30

标签: ios multithreading cocoa-touch uiimageview uiimage

我使用UIImageView来显示静态和动画图像。有时候,我正在使用.image,有时候我正在使用.animationImages。这很好。

无论是静态还是动画,我都将UIImages存储在item.frames中(见下文)

问题是我想在加载动画帧时在视图的中心显示UIActivityIndicatorView。我想在没有图像或帧的情况下发生这种情况。没有按照预期行事的那条线是:

[self.imageView removeFromSuperview];

事实上,此时将其设置为另一个图像也没有做任何事情。似乎没有UI的东西在这里发生。顺便说一句,

NSLog(@"%@", [NSThread isMainThread]?@"IS MAIN":@"IS NOT");

打印IS MAIN

那里的图像会一直存在,直到新的动画帧都在那里(1-2秒)并且它们开始动画

这是从UIView的子类运行,UIImageView作为子视图。

- (void)loadItem:(StructuresItem *)item{

    self.imageView.animationImages = nil;
    self.imageView.image = nil;   

    [self.spinner startAnimating];

    self.item = item;

    if (item.frameCount.intValue ==1){
        self.imageView.image = [item.frames objectAtIndex:0];
        self.imageView.animationImages = nil;
    }else {
        [self.imageView removeFromSuperview];

        self.imageView =[[UIImageView alloc] initWithFrame:self.bounds];
        [self addSubview:self.imageView ];
        if( self.imageView.isAnimating){
            [self.imageView stopAnimating];
        }
        self.imageView.animationImages = item.frames;
        self.imageView.animationDuration = self.imageView.animationImages.count/12.0f;

        //if the image doesn't loop, freeze it at the end
        if (!item.loop){
            self.imageView.image = [self.imageView.animationImages lastObject];
            self.imageView.animationRepeatCount = 1;
        }
        [self.imageView startAnimating];
    }

    [self.spinner stopAnimating];

}

我无知的评估是,一旦将图像设置为零,就不会重绘某些内容。会爱一只手。

1 个答案:

答案 0 :(得分:1)

我发现的不是问题的答案,而是解决问题的更好办法。简单地说,使用NSTimer而不是animationImages。它加载速度更快,不会耗尽内存并且代码更简单。耶!

这样做:

-(void)stepFrame{
    self.currentFrameIndex =   (self.currentFrameIndex + 1) % self.item.frames.count;
    self.imageView.image = [self.item.frames objectAtIndex:self.currentFrameIndex];
}

和这个

-(void)run{
    if (self.item.frameCount.intValue>1){
        self.imageView.image = [self.item.frames objectAtIndex:self.currentFrameIndex];
        self.timer = [NSTimer scheduledTimerWithTimeInterval:1/24.0f target:self selector:@selector(stepFrame) userInfo:nil repeats:YES];
    }else{
        self.imageView.image = [self.item.frames objectAtIndex:0];
    }
}