1

私のテーブルビューでは、プロジェクトの各テーブルビューでviewDidLoadを呼び出すカスタムバックグラウンドビューを作成しました:

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

Quartz2D を実行することが、パフォーマンスに関して最良の選択肢であることが私の理解でした。ただし、この背景ビューは、描画されるまでに 0.45 秒 (平均) かかります。これにより、tableView 間のすべてのナビゲーションが少し遅くなりますが、それほどではありませんが、気付くには十分です。

バックグラウンド ビューは、パターンが重なったグラデーションです。グラデーションが0.12秒で描画されることがわかったので、パターン描画がボトルネックになっているようです。驚いたのは、私の視点からは、描くのは複雑なことではなく、影のある 1 本の水平線だけであるということです。

パターンの呼び出し方法は次のとおりです (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 の正方形の中に 2 つの六角形を描くパターンを作成しました。上記のコードよりも複雑に見えますが、描画にかかる時間はわずか 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);

この 10 ピクセルの png を使用すると、全体の描画時間は 0.18 秒 (グラデーションの背景とパターン) に短縮されます。

同じ問題を抱えている人に役立つことを願っています。

于 2012-05-30T18:05:02.697 に答える
0

私が正しく理解していれば、あなたはtableViewの背景にグラデーションパターンを描画しようとしています。

グラフィックエディタで.png画像を作成し、背景に配置することをお勧めします。

それが役に立てば幸い

于 2012-05-28T19:45:31.623 に答える