在drawRect中优化CGContextDrawRadialGradient:

时间:2012-07-10 20:15:17

标签: objective-c drawrect

在我的iPad应用程序中,我有一个UITableView,每次选择一个新单元格时都会分配/插入一个UIView子类。我已经覆盖了这个UIView中的drawRect:以绘制径向渐变并且它工作正常,但是性能正在受到影响 - 当单元格被轻敲时,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);
}

谢谢!

1 个答案:

答案 0 :(得分:2)

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

  

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

对要创建的每个形状重复。

     

有关详细信息,请参阅documentation以了解上述功能。为了更好地理解绘制drawRect:和程序中任意位置之间的差异以及一般情况下的上下文,我建议您阅读Quartz2D Programming Guide,尤其是关于图形上下文的部分。