3

背景色だけで CAShapeLayer を作成すると表示されますが、コンテンツを画像に設定すると何も表示されません。

CAShapeLayer* leftDot = [CAShapeLayer layer];
leftDot.opacity = 1.0;
leftDot.frame = CGRectMake(leftRef.CGPointValue.x, leftRef.CGPointValue.y, 2 * radius, 2 * radius);
leftDot.position = CGPointMake(leftRef.CGPointValue.x + 4, leftRef.CGPointValue.y + 4);
leftDot.cornerRadius = radius;
[leftDot setContents:[UIImage imageNamed: @"glow.png"]];

[self.layer addSublayer: leftDot];
4

5 に答える 5

12

[注: Swift 2.2 および Swift 3 に更新]

簡単な答え: CALayer を使用する

CAShapeLayer Class Referenceで説明されているように、 aCAShapeLayerはカスタム パスを使用してシェイプを描画するために使用されます。画像をそのcontentsように設定しても、単に無視されます。

レイヤーに画像を表示したいだけの場合 (ファイルの名前が だとしましょうimage.png)、 を使用してCALayerそのcontentsプロパティを設定しCGImage、画像の表現を参照するようにします。

スウィフト 2.2:

let layer = CALayer()
layer.contents = UIImage(named: "image")?.CGImage

スウィフト 3:

let layer = CALayer()
layer.contents = UIImage(named: "image")?.cgImage

より長い答え: CAShapeLayer を使い続ける

OP が具体的に について尋ねたので、CAShapeLayer質問は「を使用して特定の形状に画像をトリミングするにはどうすればよいCAShapeLayerですか?」のように読むことができます。

試してみることをお勧めする解決策が 2 つあります。

1) マスキング

法線CALayerを作成し、イメージをその として設定しますcontents。次に、CAShapeLayer好きなパスで を作成し、最初のレイヤーの として使用しますmask

スウィフト 2.2:

let imageLayer = CALayer()
imageLayer.contents = UIImage(named: "image")?.CGImage // Assign your image
imageLayer.frame = ... // Define a frame

let maskPath = UIBezierPath(...) // Create your path
let maskLayer = CAShapeLayer()
maskLayer.path = maskPath.CGPath

imageLayer.mask = maskLayer // Set the mask

スウィフト 3:

let imageLayer = CALayer()
imageLayer.contents = UIImage(named: "image")?.cgImage // Assign your image
imageLayer.frame = ... // Define a frame

let maskPath = UIBezierPath(...) // Create your path
let maskLayer = CAShapeLayer()
maskLayer.path = maskPath.cgPath

imageLayer.mask = maskLayer // Set the mask

適切なフレームとパスを設定することを忘れないでください。そうすれば、必要な効果が得られるはずです。

2) 塗りつぶし色

CAShapeLayer好きなパスで を作成し、イメージを として使用しますfillColor

スウィフト 2.2:

let path = UIBezierPath(...) // Create your path
let layer = CAShapeLayer()
layer.path = path.CGPath

let image = UIImage(named: "image") // Assign your image
layer.fillColor = UIColor(patternImage: image!).CGColor

スウィフト 3:

let path = UIBezierPath(...) // Create your path
let layer = CAShapeLayer()
layer.path = path.cgPath

let image = UIImage(named: "image") // Assign your image
layer.fillColor = UIColor(patternImage: image!).cgColor

最初はこのアプローチの方が簡単だと思うかもしれませんが、画像がシェイプを塗りつぶす方法を制御することは簡単ではありません。

于 2016-06-21T12:18:52.677 に答える
3

CAShapeLayer はそのようには機能しません。画像をコンテンツとして使用して通常の CALayer を作成し、シェイプ レイヤーをそのレイヤーのマスクとして使用して、目的の効果を実現します。

于 2012-07-24T13:45:15.597 に答える
3

fillColorではなくを設定することで、画像を表示できますcontents

layer.fillColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"image"]].CGColor;
于 2014-10-16T16:12:24.867 に答える
2
layerName.contents = (id)[[UIImage imageNamed:@"img.PNG"] CGImage];
于 2012-07-26T21:13:01.683 に答える