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

标签 ios uiview uiimageview icarousel

我将 iCarousel 与 UIImageViews 一起使用没有问题,一切都很好。

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

例如,我有 26 张图片,a - z。 5 在启动时可见,a - e。如果没有“setNeedsReload”,当我滚动浏览 View 时,我会反复获得图像 a - e,而不是 a - z。

我发现如果我在 setImage 属性中添加“setNeedsDisplay”,它将正常工作。但是,这会带来巨大的性能损失。

我的问题有两个:

  1. 我是不是漏掉了什么?
  2. 我是否应该扩展 UIImageView 而不是 在像 Nick 这样的“processImage”样式方法中进行自定义绘图 在 FXImage 中做了什么?

谢谢,

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

}

最佳答案

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

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

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

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

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

关于ios - iCarousel viewForItemAtIndex 使用自定义 UIView 重新使用第一个加载的图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11301967/

相关文章:

iphone - iOS清除UIView层

ios - 截取 ImageView 的屏幕截图

ios - 按设置距离对 UIImageView 进行动画处理

ios - 带有可选图像的自定义 UITableViewCell

iphone - cocos2d 中的自由运行/横向滚动类型游戏

ios - NSTextAttachment紧缩

ios - 使用自动布局以编程方式将自定义 UIView 居中

ios - 搜索栏取消按钮委托(delegate)未调用

ios - 同时为多个 UIView 设置动画

ios - 应用程序因内存警告而崩溃