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 类参考中所述,aCAShapeLayer用于使用自定义路径绘制形状。将图像设置为其contents将被忽略。

如果您只想在图层中显示图像(假设您的文件名为image.png),则可以使用 aCALayer并设置其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?”

我建议您尝试两种解决方案:

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 回答
0

您必须为图层设置 CGImage

leftDot.fillColor=[UIColor clearColor].CGColor ;
[leftDot setContents:(__bridge id)[UIImage imageNamed: @"glow.png"].CGImage];
于 2014-08-22T07:24:02.653 回答