2

パス付きのCAShapeLayerを使用しています。今度は、厚さ約10単位の滑らかな影を投げたいと思います。

最初に:ええ、私は11個のCAShapeLayerオブジェクトを作成することができ、毎回、パスのアウトラインを1単位ずつ増やし、反復ごとに異なる色とアルファを追加します。しかし、この方法では、メモリフットプリントが大きくなります。これは、画面サイズが半分であり、これは、メモリに画面サイズが半分のビットマップの11倍になることを意味します。

したがって、iPhone OS 3.2以降、CALayerでこれらの気の利いたシャドウプロパティを使用できるようになりました。しかし、私はOS3.0に固執したいと思います。それで、上記の厄介なもの以外に、どのようなオプションがありますか?

4

1 に答える 1

0

CoreGraphicsを使用してシャドウを作成できます。必要なビルディングブロックは、QuartzDemoサンプルで説明されています。特にQuartzClipping.mclass QuartzMaskingViewをご覧ください。

  1. シェイプレイヤーのコンテンツを画像にキャプチャします
  2. お好みに合わせてシャドウを設定
  3. 透明レイヤーを開始
  4. レイヤーコンテンツの画像にクリップします-その外側に描画します
  5. もう一度画像を描きます

これにより、マスクされた領域の外側に影がペイントされます。

CGSize size = CGSizeMake(300, 100);

UIGraphicsBeginImageContextWithOptions(size,NO, 0.0);
[shapeLayer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

CGRect flippedImageRect = 
    CGRectMake(0, 0, image.size.width, -image.size.height);

CGContextRef ctx = UIGraphicsGetCurrentContext();
CGContextSaveGState(ctx);
CGContextSetShadowWithColor(ctx, CGSizeMake(4, 4), 2, 
    [[UIColor colorWithWhite:0 alpha:0.4] CGColor]);
CGContextBeginTransparencyLayer(ctx, NULL);
CGContextScaleCTM(ctx, 1.0, -1.0);
CGContextClipToMask(ctx, flippedImageRect, [image CGImage]);   
CGContextSetFillColorWithColor(ctx, [[UIColor redColor] CGColor]); 
CGContextDrawImage(ctx, flippedImageRect, [image CGImage]);
CGContextEndTransparencyLayer(ctx);
CGContextRestoreGState(ctx);
于 2011-05-19T00:02:51.230 に答える