iPhone OS 3.0にカシピェラレイヤーに影を投げる方法は?
-
04-10-2019 - |
質問
私はパスを持つカシャーペレイヤーを使用しています。今、私はそれが約10ユニットの厚さで滑らかな影を投げたいと思っています。
まず:ええ、11のCashaPelayerオブジェクトを作成することができ、そのたびにパスのアウトラインを1ユニットで増加させ、すべての反復でさらにアルファを備えています。しかし、このようにして、メモリのサイズが半分であるため、メモリフットプリントを爆破し、これはメモリにハーフスクリーンサイズの11倍のビットマップがあることを意味します。
したがって、iPhone OS 3.2以来、おそらくCalayerでこれらの気の利いたシャドウプロパティを使用できます。しかし、私はOS 3.0に固執したいです。上記の厄介なもの以外に、私はどのようなオプションを持っていますか?
解決
コアグラフィックを使用してシャドウを作成できます。必要なビルディングブロックには、説明されています Quartzdemo サンプル。特に、見てください class QuartzMaskingView
の QuartzClipping.M.
- 形状層の内容を画像にキャプチャします
- あなたの好みに影を設定します
- 透明レイヤーを開始します
- レイヤーコンテンツの画像にクリップします - あなたはそれの外に描画するでしょう
- もう一度画像を描きます
これにより、隠れた領域の外に影が塗られます。
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);
所属していません StackOverflow