2

CALayer のグループにシャドウを追加するにはどうすればよいですか? いくつかの「SliceView」クラスを維持する「FoldingView」クラスがあります。各スライスビューのレイヤーには、パースペクティブ プロパティ (.m34 = 1.0 / -1000) を使用している CATransform3D が与えられます。

適切なビジュアル ロジックで影を追加するにはどうすればよいですか? これは私がこれまで考えてきたことです:

  1. 各スライスのパスを取得し、これらを組み合わせてシャドウ パスを取得できます。

    • レイヤーがCATransform3Dを使用している場合、CALayerのパスを取得する方法がわかりません
    • 視覚的にはうまくいくかもしれませんが、光が左上から来ているとしたら、完全に正しいとは言えません.
  2. 標準の CALayer シャドウをすべてのレイヤーに適用するだけで済みます

    • 影が重なって見栄えが悪い

誰かが他の提案を持っているか、アイデア番号1をコーディングする方法を知っていれば、私はとても幸せです! スクリーンショットが表示されるサンプル プロジェクトへのリンクを次に示します。

コード付きの圧縮されたアプリケーションをダウンロードする

アプリケーションのサンプル画像

4

1 に答える 1

1

これは思い通りに動作するようです。これはスライスビューごとに行われます。

- (UIBezierPath *)shadowPath
{ 

    if(self.progress == 0 && self.position != VGFoldSliceCenter)
    {
        UIBezierPath *path = [UIBezierPath bezierPath];  
        return path;
    }
    else
    { 
        CGPoint topLeft = pointForAnchorPointInRect(CGPointMake(0, 0), self.bounds);
        CGPoint topRight = pointForAnchorPointInRect(CGPointMake(1, 0), self.bounds);
        CGPoint bottomLeft = pointForAnchorPointInRect(CGPointMake(0, 1), self.bounds);
        CGPoint bottomRight = pointForAnchorPointInRect(CGPointMake(1, 1), self.bounds);

        CGPoint topLeftTranslated = [self.superview convertPoint:topLeft fromView:self];
        CGPoint topRightTranslated = [self.superview convertPoint:topRight fromView:self];
        CGPoint bottomLeftTranslated = [self.superview convertPoint:bottomLeft fromView:self];
        CGPoint bottomRightTranslated = [self.superview convertPoint:bottomRight fromView:self];

        UIBezierPath *path = [UIBezierPath bezierPath];

        [path moveToPoint:topLeftTranslated];
        [path addLineToPoint:topRightTranslated];
        [path addLineToPoint:bottomRightTranslated];
        [path addLineToPoint:bottomLeftTranslated];
        [path closePath]; 

        return path;
    } 
}
于 2012-08-15T09:01:06.717 に答える