2012-03-18 3 views
0

これは私のcoregraphicsコードです:CoreGraphicsは大規模な表示にしばらく時間を取っています。ピクセルを繰り返すことができますか?

void drawTopPaperBackground(CGContextRef context, CGRect rect) { 

    CGRect paper3 = CGRectMake(10, 14, 300, rect.size.height - 14); 
    CGRect paper2 = CGRectMake(13, 12, 294, rect.size.height - 12); 
    CGRect paper1 = CGRectMake(16, 10, 288, rect.size.height - 10); 

    //Shadow 
    CGContextSetShadowWithColor(context, CGSizeMake(0,0), 10, [[UIColor colorWithWhite:0 alpha:0.5]CGColor]); 
    CGPathRef path = createRoundedRectForRect(paper3, 0); 
    CGContextSetFillColorWithColor(context, [[UIColor blackColor] CGColor]); 
    CGContextAddPath(context, path); 
    CGContextFillPath(context); 

    //Layers of paper 
    CGContextSaveGState(context); 

    drawPaper(context, paper3); 
    drawPaper(context, paper2); 
    drawPaper(context, paper1); 

    CGContextRestoreGState(context); 

} 

void drawPaper(CGContextRef context, CGRect rect) { 
    //Shadow 
    CGContextSaveGState(context); 

    CGContextSetShadowWithColor(context, CGSizeMake(0,0), 1, [[UIColor colorWithWhite:0 alpha:0.5]CGColor]); 

    CGPathRef path = createRoundedRectForRect(rect, 0); 
    CGContextSetFillColorWithColor(context, [[UIColor blackColor] CGColor]); 
    CGContextAddPath(context, path); 
    CGContextFillPath(context); 

    CGContextRestoreGState(context); 

    //Gradient 

    CGContextSaveGState(context); 

    CGColorRef startColor = [UIColor colorWithWhite:0.92 alpha:1.0].CGColor; 
    CGColorRef endColor = [UIColor colorWithWhite:0.94 alpha:1.0].CGColor; 

    CGRect firstHalf = CGRectMake(rect.origin.x, 
            rect.origin.y, rect.size.width/2, rect.size.height); 
    CGRect secondHalf = CGRectMake(rect.origin.x + (rect.size.width/2), 
            rect.origin.y, rect.size.width/2, rect.size.height); 

    drawVerticalGradient(context, firstHalf, startColor, endColor); 
    drawVerticalGradient(context, secondHalf, endColor, startColor); 

    CGContextRestoreGState(context); 

    CGContextSaveGState(context); 

    CGRect redRect = rectForRectWithInset(rect, -1); 
    CGMutablePathRef redPath = createRoundedRectForRect(redRect, 0); 


    CGContextSaveGState(context); 
    CGContextSetStrokeColorWithColor(context, [[UIColor blackColor] CGColor]); 

    CGContextAddPath(context, path); 
    CGContextClip(context); 

    CGContextAddPath(context, redPath); 
    CGContextSetShadowWithColor(context, CGSizeMake(0, 0), 15.0, [[UIColor colorWithWhite:0 alpha:0.1] CGColor]); 
    CGContextStrokePath(context); 

    CGContextRestoreGState(context); 

} 

ビューがTextViewのが含まれているUIScrollViewの、です。ユーザーが何かを入力して新しい行に移動するたびに、私は[self setNeedsDisplay];を呼び出し、コードを再描画します。しかし、視界が1000前後に長くなると、それは非常に目立つ遅れがあります。このコードをより効率的にするにはどうすればよいですか?私はピクセルの行を取ることができますそれを繰り返すだけ、またはそれを伸ばし、すべての方法をダウン?

答えて

2

繰り返しの背景をオフスクリーンのコンテキストに1回描画し、そのイメージを引き出してパターンイメージでUIColorを作成し、それを背景色に設定することができます。イメージはあなたのために並べられます。

UIGraphicsBeginImageContextWithOptions()でイメージコンテキストを開始します。オプションには、あなたの予想される画像のサイズが含まれています - これはあなたのスクロールビューとxピクセルの高さ、不透明度、およびスケールと見なします。自動網膜のサポートのためにスケールを0にします。

あなたはdrawRectメソッド内にいるかのように振る舞うことができます。上の関数を通常のように呼び出すことができます。その後

、画像を抽出:

UIImage *background = UIGraphicsGetImageFromCurrentImageContext(); 

は、画像コンテキスト終了:

UIColor *backgroundColor = [UIColor colorWithPatternImage:background]; 

そして、あなたのscrollviewの背景としてあることを設定します。

UIGraphicsEndImageContext(); 

を次に色を作成します。電話で入力したので、すべてのことを謝ります。

+0

どうすればキャッシュできますか?そして、私はどのように3番目のオプションをコーディングしますか? – Andrew

+0

私は3番目の選択肢が最善であると思いますので、私はいくつかのオプションがあるのではなく、その答えをいくつかのガイドラインで更新します。 – jrturton

+0

偉大な、ありがとう:) – Andrew

関連する問題