2012-03-19 20 views
9

HOLLOW CGPathの外端にシャドウを追加したい(これらの2つの単語はクリティカル:outside + hollow :))。CALayer.shadowによって作成された影をクリッピングする

アップルのシャドウインプリメンテーションでは、「塗りつぶした」シャドウのみを使用できます。

だから...影の内側の部分を切り取る方法は?それがレンダリングコールだった場合は、CGContextSetClip *メソッドを呼び出して、それを私が望む場所にクリップするようにしましたが、レンダリングコールでもCALayerでもないので、どうやって手に入るのか分かりません。

(マジック変数のセットとして、それを「隠し」、アップルの不幸な結果、私は推測?)

NB:これは唯一のiOSある - IIRC Mac上であなたの影を作成するために使用されるフィルタに直接アクセスすることが、あなたは手作業で独自の(任意の)影を作成することができます。


UPDATE:

私は影の唯一の内側の部分を表示するようにクリップする方法を働いた:現在の層(のクローンだ新たな層であることを、「layer.mask」に設定つまり、同じパス)、パスの塗りつぶしを完全なアルファを持つものに設定します。

これは私が試していることの反対です。したがって、アルファをフリップするマスクレイヤーを得る方法を考えれば(0は1になり、1は0になります)、私はそこにいます...

あなたと仮定すると

答えて

5

は方法があります:

-(CAShapeLayer*) cloneShapeLayer; // creates a new CAShapeLayer and copies the values 

...その後、次の操作を行います。

  1. コピー層は、 "マスク"
  2. テイクマスク作成 - 同じCGPathには、覚えている - と交換してくださいそのPA
    1. 層全体
    2. のRECT MINUS元のパス
    3. (EOルールを使用することによって達成される)
  3. 元の層のマスクを設定(:有しパスと番目

    CAShapeLayer* maskLayer = [originalLayer cloneShapeLayer]; 
    // got to make it a bit bigger if your original path reaches to the edge 
    // since the shadow needs to stretch "outside" the frame: 
    CGFloat shadowBorder = 50.0; 
    maskLayer.frame = CGRectInset(maskLayer.frame, - shadowBorder, - shadowBorder); 
        maskLayer.frame = CGRectOffset(maskLayer.frame, shadowBorder/2.0, shadowBorder/2.0); 
    maskLayer.fillColor = [UIColor blackColor].CGColor; 
    maskLayer.lineWidth = 0.0; 
    maskLayer.fillRule = kCAFillRuleEvenOdd; 
    
    CGMutablePathRef pathMasking = CGPathCreateMutable(); 
    CGPathAddPath(pathMasking, NULL, [UIBezierPath bezierPathWithRect:maskLayer.frame].CGPath); 
    CGAffineTransform catShiftBorder = CGAffineTransformMakeTranslation(shadowBorder/2.0, shadowBorder/2.0); 
    CGPathAddPath(pathMasking, NULL, CGPathCreateCopyByTransformingPath(maskLayer.path, &catShiftBorder)); 
    maskLayer.path = pathMasking; 
    
    shapeLayer.mask = maskLayer; 
    
    :コード内の新しいレイヤー「マスク」

すなわちすべき影付き1)

NB:これは実際には機能しますが、マスキングしていないときに比べてシャドウが少し拡大しているように見えます。しかたがない。

+0

私はこれを試しましたが、私のレイヤーに何も起こらず、あなたは 'shadowBorderWidth'を定義しませんでした。その意味? –

+0

私はコードを変更しました。それがまだ機能するかどうかはわからないが、おそらくそうだろう。それがうまくいかない場合は、cloneShapeLayerメソッド、CGPathの巻き取りルール、元のCGPath自体など、たくさんのデバッグがあります...これはあなたのソースコードとあなたのイメージデータに非常に依存しています - 私はあなたのためにそれをデバッグすることはできません。 – Adam

+0

ありがとう、私はこれを試してみます:) –

関連する問題