1

UIView drawRect に内側の影を描画する次のコードがあります。

//add some inner shadow to the card box
    CGContextSaveGState(context);

    CGMutablePathRef cardPath = CGPathCreateMutable();
    CGPathAddRect(cardPath, NULL, CGRectInset(mainRect, -42, -42));
    CGPathAddPath(cardPath, NULL, mainPathRef);
    CGPathCloseSubpath(cardPath);

    // Add the visible paths as the clipping path to the context
    CGContextAddPath(context, mainPathRef);
    CGContextClip(context);

    // Now setup the shadow properties on the context
    UIColor *innerShadowColor = [UIColor colorWithWhite:133/255.f alpha:1.0];
    CGContextSetShadowWithColor(context, CGSizeMake(0.0f, 1.0f), 30.0f, [[UIColor orangeColor] CGColor]);

    // Now fill the rectangle, so the shadow gets drawn
    [innerShadowColor setFill];
    CGContextSaveGState(context);
    CGContextAddPath(context, cardPath);
    CGContextEOFillPath(context);
    CGContextRestoreGState(context);

    // Release the paths
    CGPathRelease(cardPath);

    CGContextRestoreGState(context);

    CGPathRelease(mainPathRef);

問題は、これが非常に遅いことです。このコードを少し高速化する方法はありますか?

4

1 に答える 1

3

可能であれば、画像エディターで影を作成し、png として保存してから、必要に応じてサイズとタイルを変更します。

別のアイデアは、 CALayershouldRasterizeのプロパティを使用することです。描画の結果をキャッシュし、ビューが変更されていない間はそれを使用します。この場合、パフォーマンスは、ビューの内容を変更する頻度によって異なります。

于 2013-01-26T11:00:54.863 に答える