4

在我的 iPad 应用程序中,我有一个 UITableView,它在每次选择新单元格时分配/初始化一个 UIView 子类。我已drawRect:在此 UIView 中重写以绘制径向渐变,它工作正常,但性能受到影响 - 当点击单元格时,UIView 以编程方式绘制渐变需要更长的时间,而不是使用 .png 作为背景。有没有办法“缓存”我的drawRect:方法或它生成的梯度以提高性能?我宁愿使用drawRect:而不是.png。我的方法如下所示:

- (void)drawRect:(CGRect)rect
{
     CGContextRef context = UIGraphicsGetCurrentContext();

     size_t gradLocationsNum = 2;
     CGFloat gradLocations[2] = {0.0f, 1.0f};
     CGFloat gradColors[8] = {0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.5f}; 
     CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
     CGGradientRef gradient = CGGradientCreateWithColorComponents(colorSpace, gradColors, gradLocations, gradLocationsNum);
     CGColorSpaceRelease(colorSpace);

     CGPoint gradCenter = CGPointMake(CGRectGetMidX(self.bounds), CGRectGetMidY(self.bounds));
     float gradRadius = MIN(self.bounds.size.width , self.bounds.size.height) ;

     CGContextDrawRadialGradient (context, gradient, gradCenter, 0, gradCenter, gradRadius, kCGGradientDrawsAfterEndLocation);

     CGGradientRelease(gradient);
}

谢谢!

4

1 回答 1

2

您可以将图形渲染到上下文中,然后将其存储为 UIImage。这个答案应该让你开始:

drawRect:是一种UIView用于绘制视图本身的方法,而不是预先创建图形对象。

由于您似乎想要创建形状来存储它们并稍后绘制,因此创建形状UIImage并使用UIImageView. UIImage可以直接存储在NSArray.

要创建图像,请执行以下操作(在主队列中;不在 drawRect 中:):

1)创建位图上下文

UIGraphicsBeginImageContextWithOptions(size, opaque, scale);

2)获取上下文

CGContextRef context = UIGraphicsGetCurrentContext();

3)画你需要的任何东西

4) 将上下文导出为图像

UIImage *image = UIGraphicsGetImageFromCurrentImageContext();

5)破坏上下文

UIGraphicsEndImageContext();

6)存储对图像的引用

[yourArray addObject:image];

对您要创建的每个形状重复此操作。

有关详细信息,请参阅上述功能的文档。为了更好地理解drawRect:在程序中任意位置绘制和使用上下文之间的区别,我建议您阅读Quartz2D 编程指南,尤其是图形上下文部分。

于 2012-11-16T20:56:28.703 回答