使用自定义UIView的iCarousel viewForItemAtIndex重新使用加载的第一个图像

时间:2012-07-02 22:23:31

标签: ios uiview uiimageview icarousel

使用iCarousel和UIImageViews没有问题,一切都很好。

但是,我想在图像中添加一些额外的绘图,所以我做了一个UIView的快速子类,其中包含一个图像并有一个自定义绘图例程。很简单。但是,在 viewForItemAtIndex 内部,当我设置图像属性时,它不会直观更新。相反,它会重复表示可见图像的n个图像,从而重复最初加载的对象。

例如,我有26张图片,a - z。 5启动时可见,a - e。如果没有'setNeedsReload',当我滚动视图时,我会反复获取图像,而不是a - z。

我发现如果我在setImage属性中添加' setNeedsDisplay ',它将正常工作。但是,存在巨大的性能损失。

我的问题有两个:

  1. 我错过了什么吗?
  2. 我应该只是扩展UIImageView而且 在像Nick这样的'processImage'样式方法中进行自定义绘制 在FXImage做过吗?
  3. 谢谢,

    /// GroupImageView.m
    
    - (void)setImage:(UIImage *)newImage {
        image = newImage;
        [self setNeedsDisplay];
    }
    
    // override of the drawRect routine.
    - (void)drawRect:(CGRect)rect {
    
        //  only draw if we have an image to draw
        if (image) {
            CGContextRef context = UIGraphicsGetCurrentContext();
    
            // blah blah, fancy drawing crap
            CGContextRotateCTM (context, radians((rand() % 5 + 2)));
            CGContextTranslateCTM(context, -0.5f * insetRect.size.width, -0.5f * insetRect.size.height);
            CGContextFillRect(context,insetRect);
            // etc
    
            [image drawInRect:insetRect blendMode:kCGBlendModeNormal alpha:[self alpha]];
    
            // etc
        } 
    }
    

    - (UIView *)carousel:(iCarousel *)carousel viewForItemAtIndex:(NSUInteger)index reusingView:(UIView *)view {
    
        if (view == nil) {
            view = [[GroupImageView alloc] initWithImage:[UIImage imageNamed:@"Loading.png"]];
        }
        CGImageRef ref = [group posterImage];
        UIImage* coverImage;
        if (ref) {
            coverImage = [UIImage imageWithCGImage:ref scale:1/scaleFactor orientation:UIImageOrientationUp];
        }
        else {
            coverImage = [UIImage imageNamed:@"Sunflower.png"];
        }
    
        [(GroupImageView*)view setImage:coverImage];
        return view;
    
    }
    

1 个答案:

答案 0 :(得分:2)

UIImageView不使用drawRect绘制图像,因为drawRect使用Core Graphics进行绘制,而Core Graphics不是硬件加速。

使用drawRect绘制其内容的UIView子类将比UIImageView慢100倍,这就是你遇到性能问题的原因。

FXImageView通过在后台线程上绘图并使用NSOperationQueue来确保根据需要按顺序更新图像来解决这个问题。

分叉FXImageView并修改processImage方法来绘制图形并不是一个坏主意 - 它肯定比从头开始重新创建FXImageView的排队和缓存行为要少。请注意,您还需要修改缓存键逻辑,因为FXImageView的缓存基于它使用的特定绘图属性。

我可能会考虑更新FXImageView以包含自定义绘图块属性 - 它似乎可能有用。