对于我的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秒就可以了。
我在这里做错了吗?我对石英绘图的了解并不是那么大,我会很感激一些投入。提前谢谢!
答案 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图像并将其放在背景上。
希望有所帮助