我将 iCarousel 与 UIImageViews 一起使用没有问题,一切都很好。
但是,我想用图像添加一些额外的绘图,所以我做了一个 UIView 的快速子类,其中包含一个图像并有一个自定义绘图例程。很简单。但是,在 viewForItemAtIndex 内部,当我设置图像属性时,它不会在视觉上更新。相反,它会重复表示可见图像的 n 个图像,从而重复最初加载的对象。
例如,我有 26 张图片,a - z。 5 在启动时可见,a - e。如果没有“setNeedsReload”,当我滚动浏览 View 时,我会反复获得图像 a - e,而不是 a - z。
我发现如果我在 setImage 属性中添加“setNeedsDisplay”,它将正常工作。但是,这会带来巨大的性能损失。
我的问题有两个:
- 我是不是漏掉了什么?
- 我是否应该扩展 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/