所以我正在尝试制作一个具有重复背景的UITableView。我希望背景与文本一起滚动。问题是背景是2张图片。顶部图像的高度约为550像素,然后是高度为2像素的转发器图像。我希望顶部图像与表格视图一起滚动,然后最终离开顶部,然后段图像重复。该视图实际上位于视图控制器中的UITableView下方。
这是我的背景画。我在最顶层的桌面视图中调用setNeedsDisplay。
-(void)drawRect:(CGRect) rect
{
CGRect topRect = CGRectMake(0, _tableViewRect.origin.y, 320, min( max(0, CGImageGetHeight(top) - _tableViewRect.origin.y), _tableViewRect.size.height));
CGRect segmentRect = CGRectMake(0, topRect.size.height, 320, _tableViewRect.size.height - topRect.size.height);
if(topRect.size.height > 0)
{
CGImageRef newImageRef = CGImageCreateWithImageInRect(top, topRect);
UIImage *newImage = [UIImage imageWithCGImage:newImageRef];
[newImage drawAtPoint:CGPointMake(0,0)];
}
[[UIImage imageWithCGImage: segment] drawAsPatternInRect:segmentRect];
}
它有效,但我的3G非常笨拙。有没有人有任何优化技巧或其他方式?
干杯
答案 0 :(得分:2)
每次都不要创建新图像;缓存你的UIImage,然后使用CoreGraphics调用将你的CGContextRef重新定位到'指向'到正确的区域,在那里blit图像,然后继续前进。如果您要分析上面的代码,我想CGImageCreateWithImageInRect()占用了浩大的大部分周期。
您应该使用contentOffset,而不是_tableViewRect。另外,看看你的代码,虽然摆脱上面的东西会有所帮助,但我不确定它是否足够,因为你将重新绘制很多东西。也就是说,这是一个可能有效的片段:
//I'm not sure what _tableViewRect is, so let's just assume you've got
//some variable, tableScrollY, that represents the scroll offset of your table
CGContextRef context = UIGraphicsGetCurrentContext();
if (tableScrollY < top.size.height) { //okay, we need to draw at least PART of our image
CGContextSaveGState(context);
CGContextDrawImage(context, CGRectMake(0, -tableScrollY, top.size.width, top.size.height), top.CGImage);
}
这应该是代码中间if(...)部分的替代品。这没有经过测试,所以你可能需要稍微改进一下。