【问题标题】:Optimize CGContextDrawRadialGradient in drawRect:优化drawRect中的CGContextDrawRadialGradient:
【发布时间】:2012-07-10 20:15:17
【问题描述】:

在我的 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);
}

谢谢!

【问题讨论】:

    标签: objective-c drawrect


    【解决方案1】:

    您可以将图形渲染到上下文中,然后将其存储为 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,尤其是有关图形上下文的部分。

    【讨论】:

    • 据我所知,Objective-C 没有高亮提示。普通的 C 可以工作吗?
    • 我已经看到我的方式的错误,并会忏悔:)(感谢编辑)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-01
    相关资源
    最近更新 更多