UITableView用2张图片重复背景

时间:2009-11-20 01:04:26

标签: iphone objective-c uitableview background

所以我正在尝试制作一个具有重复背景的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非常笨拙。有没有人有任何优化技巧或其他方式?

干杯

1 个答案:

答案 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(...)部分的替代品。这没有经过测试,所以你可能需要稍微改进一下。