0

サブクラス化された UIView で drawRect をオーバーライドして、tableView の単純なテクスチャ背景を作成することに興味があります。目標は達成しましたが、パフォーマンスはあまり良くありません。これは、私のような初心者に共通の問題であることを理解しています。ただし、これが CoreGraphics での最初の作業であるため、問題の原因を診断するのに苦労しています。

パフォーマンス ヒットとは、ナビゲーション コントローラーを介して tableViewController がアニメーション化される前に遅延があることを意味します。あなたが望むなら、それはハングします。[[self tableView] setBackgroundView:level1View]; の適切な設定で、UITableViewControllers のいずれかが最初に開始されたときに、パフォーマンスの低下が発生します。テーブル ビューの後続のレンダリングでは、パフォーマンス ヒットはありません。backgroundView プロパティをカスタム描画ビューに設定しないと、パフォーマンスの問題はなくなります。どんな考えでも大歓迎です。

いくつかの注意点: パフォーマンスが向上する唯一の方法でない限り、このために画像を並べて表示したくありません。(学習しようとしています。)また、ここにあるチュートリアルに基づいてコードを作成しました: http://www.raywenderlich.com/2167/core-graphics-101-patterns

#import "HordLevel1View.h"

static inline double radians (double degrees) { return degrees * M_PI/180; }
void MyDrawColoredPattern1 (void *info, CGContextRef context)
{

UIColor * dotColor = [UIColor colorWithHue:0 saturation:0 brightness:0.90 alpha:1.0];
UIColor * shadowColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.2];

CGContextSetFillColorWithColor(context, dotColor.CGColor);
CGContextSetShadowWithColor(context, CGSizeMake(0, 0), .25, shadowColor.CGColor);

//First line of circles
CGContextAddArc(context, 1, 1, 1, 0, radians(360), 0);
CGContextFillPath(context);

CGContextAddArc(context, 3, 2, 1, 0, radians(360), 0);
CGContextFillPath(context);

CGContextAddArc(context, 5, 0, 1, 0, radians(360), 0);
CGContextFillPath(context);

CGContextAddArc(context, 5, 3, 1, 0, radians(360), 0);
CGContextFillPath(context);

CGContextAddArc(context, 1, 4, 1, 0, radians(360), 0);
CGContextFillPath(context);

CGContextAddArc(context, 3, 5, 1, 0, radians(360), 0);
CGContextFillPath(context);

CGContextAddArc(context, 5, 6, 1, 0, radians(360), 0);
CGContextFillPath(context);

}


@implementation HordLevel1View

- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
    // Initialization code
}
return self;
}

- (void)drawRect:(CGRect)rect
{
CGContextRef context = UIGraphicsGetCurrentContext();

UIColor * bgColor = [UIColor colorWithHue:0 saturation:0 brightness:0.85 alpha:1.0];
CGContextSetFillColorWithColor(context, bgColor.CGColor);
CGContextFillRect(context, rect);

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

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

CGPatternRef pattern = CGPatternCreate(NULL,
                                       rect,
                                       CGAffineTransformIdentity,
                                       6,
                                       6,
                                       kCGPatternTilingConstantSpacing,
                                       true,
                                       &callbacks);
CGFloat alpha = 1.0;
CGContextSetFillPattern(context, pattern, &alpha);
CGPatternRelease(pattern);
CGContextFillRect(context, self.bounds);
CGContextRestoreGState(context);
}


@end 
4

1 に答える 1

0

申し訳ありませんが、誰もこれに到達しませんでした。私の返信がまだ関連していることを願っています! 私はあなたが3月から長い道のりを歩んできたことを確信しています。

私が最初に考えたのは、画像は単に高速な方法であるだけでなく、より単純なコードであり、より柔軟でもあるということです。しかし、ユーザー入力に応じてコンテンツが根本的に変化するため、動的に描画する必要があるとしましょう(これはありそうにないと思います:])。

その場合、さらにいくつかの考え:

  • drawRect 呼び出しごとに 1 回ではなく、セル ビューごとに 1 回ではなく、パターンを 1 回作成します。
  • さらに良いことに、パターンを使用して UIImage を作成し、それをセルで使用します
  • パターンに正しい境界を使用します(ビュー全体のサイズのパターンを作成していると思います)
于 2014-01-07T22:10:11.773 に答える