質問

私はパスを持つカシャーペレイヤーを使用しています。今、私はそれが約10ユニットの厚さで滑らかな影を投げたいと思っています。

まず:ええ、11のCashaPelayerオブジェクトを作成することができ、そのたびにパスのアウトラインを1ユニットで増加させ、すべての反復でさらにアルファを備えています。しかし、このようにして、メモリのサイズが半分であるため、メモリフットプリントを爆破し、これはメモリにハーフスクリーンサイズの11倍のビットマップがあることを意味します。

したがって、iPhone OS 3.2以来、おそらくCalayerでこれらの気の利いたシャドウプロパティを使用できます。しかし、私はOS 3.0に固執したいです。上記の厄介なもの以外に、私はどのようなオプションを持っていますか?

役に立ちましたか?

解決

コアグラフィックを使用してシャドウを作成できます。必要なビルディングブロックには、説明されています Quartzdemo サンプル。特に、見てください class QuartzMaskingViewQuartzClipping.M.

  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);
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top