backgroundView的慢模式绘图

时间:2012-05-28 19:35:42

标签: ios uitableview background quartz-2d

对于我的tableview我已经完成了一个自定义背景视图,我在项目的每个tableView上调用viewDidLoad:

- (void)viewDidLoad{
    [super viewDidLoad];
    //other unrelated sutff
    self.tableView.backgroundView=[[BlueStyleBackground alloc]init];
}

我的理解是,做石英2D的东西是性能方面的最佳选择。但是,此背景视图需要0.45秒(平均值)才能绘制。这使得tableViews之间的所有导航都有点慢,但不足以引起注意。

背景视图是重叠图案的渐变。我发现渐变在0.12秒内被绘制,因此瓶颈似乎是图案绘制。让我感到惊讶的是,从我的观点来看,绘制它似乎并不复杂,它只是一条带阴影的水平线。

以下是调用模式的方法(在recDraw中):

static const CGPatternCallbacks callbacks = { 0, &MyDrawColoredPattern2, NULL };

CGContextSaveGState(context);
CGColorSpaceRef patternSpace = CGColorSpaceCreatePattern(NULL);
CGContextSetFillColorSpace(context, patternSpace);
CGColorSpaceRelease(patternSpace);


CGPatternRef pattern = CGPatternCreate(NULL,
                                         rect,//superficie que ha de cobrir CGRectMake(0, 0,self.bounds.size.width,8),
                                       CGAffineTransformIdentity,
                                       self.bounds.size.width,   // espai entre patrons (X)
                                       2,   // espai entre patrons (Y)
                                       kCGPatternTilingConstantSpacing,
                                       true,
                                       &callbacks);

这是模式代码:

void MyDrawColoredPattern2 (void *info, CGContextRef context) {

    UIColor* __autoreleasing blauClar = [UIColor colorWithRed: 0.65 green: 0.65 blue: 0.65 alpha: 1];
    UIColor* __autoreleasing blauFosc = [UIColor colorWithRed: 0.106 green: 0.345 blue:0.486 alpha:1];     
    CGColorRef dotColor = blauFosc.CGColor;
    CGColorRef shadowColor = blauClar.CGColor;

    CGContextSetFillColorWithColor(context, dotColor);
    CGContextSetShadowWithColor(context, CGSizeMake(0, 1), 5, shadowColor);

    CGContextFillRect(context, CGRectMake(0, 0, 480, 1));
}

之前我做了一个在24 + 24平方内绘制两个六边形的图案。上面的代码看起来更复杂,但只需0.15秒就可以了。

我在这里做错了吗?我对石英绘图的了解并不是那么大,我会很感激一些投入。提前谢谢!

2 个答案:

答案 0 :(得分:1)

我讨厌回答自己,但经过一些试验和错误,我发现将模式代码更改为以下内容,可以解决问题:

UIColor *__autoreleasing tileColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"pattern6-65.png"]];

CGColorRef tileCGColor = [tileColor CGColor];
CGColorSpaceRef colorSpace = CGColorGetColorSpace(tileCGColor);
CGContextSetFillColorSpace(context, colorSpace);

if (CGColorSpaceGetModel(colorSpace) == kCGColorSpaceModelPattern)
{
    CGFloat alpha = 1.0f;
    CGContextSetFillPattern(context, CGColorGetPattern(tileCGColor), &alpha);
}
else
{
    CGContextSetFillColor(context, CGColorGetComponents(tileCGColor));
}

CGContextFillRect(context, CGRectMake(0, 0, 10, 10));

它的作用是用一个非常小的png生成的图案填充屏幕。所以我不得不用photoshop绘制png,然后将其添加到项目中。 png越大越快,但在Photoshop中画画就越困难。

必须修改对模式的调用以适合png的大小(此处为10个像素):

CGPatternRef pattern = CGPatternCreate(NULL,
                                             rect,//superficie que ha de cobrir CGRectMake(0, 0,self.bounds.size.width,8),
                                           CGAffineTransformIdentity,
                                           10,   // espai entre patrons (X) self.bounds.size.width
                                           10,   // espai entre patrons (Y)
                                           kCGPatternTilingConstantSpacing,
                                           true,
                                           &callbacks);

使用这个10px png,整个绘图时间减少到0.18秒(渐变背景加图案)。

我希望它可以帮助有同样问题的人。

答案 1 :(得分:0)

如果我理解正确,你试图在tableView背景上绘制渐变图案。

我建议你在任何图形编辑器中创建.png图像并将其放在背景上。

希望有所帮助

相关问题