1

对于我的 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 秒。

我在这里做错了吗?我对石英绘图的了解并不是那么大,我将不胜感激。提前致谢!

4

2 回答 2

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 秒(渐变背景加图案)。

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

于 2012-05-30T18:05:02.697 回答
0

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

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

希望能帮助到你

于 2012-05-28T19:45:31.623 回答