UIImage作为CAShapeLayer的内容

Chr*_*ris 3 core-animation objective-c ios

如果我创建一个仅显示背景颜色的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];
Run Code Online (Sandbox Code Playgroud)

Par*_*ara 11

[注意:更新到Swift 2.2和Swift 3]

快速回答:使用CALayer

如CAShapeLayer类参考中所述,a CAShapeLayer用于使用自定义路径绘制形状.将图像设置为contents将被忽略.

如果您只想在图层中显示图像(假设您的文件已命名image.png),您可以使用a CALayer并设置其contents属性,以便它引用CGImage图像的表示形式:

Swift 2.2:

let layer = CALayer()
layer.contents = UIImage(named: "image")?.CGImage
Run Code Online (Sandbox Code Playgroud)

斯威夫特3:

let layer = CALayer()
layer.contents = UIImage(named: "image")?.cgImage
Run Code Online (Sandbox Code Playgroud)

更长的答案:继续使用CAShapeLayer

由于OP专门询问CAShapeLayer,问题可能读作"如何使用图像将图像裁剪成特定形状CAShapeLayer?"

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

1)掩蔽

创建法线CALayer并将图像设置为contents.然后CAShapeLayer使用您喜欢的路径创建一个并将其用作第一层mask.

Swift 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
Run Code Online (Sandbox Code Playgroud)

斯威夫特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
Run Code Online (Sandbox Code Playgroud)

不要忘记设置正确的框架和路径,你应该能够达到你想要的效果.

2)填充颜色

CAShapeLayer使用您喜欢的路径创建一个,然后使用您的图像fillColor.

Swift 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
Run Code Online (Sandbox Code Playgroud)

斯威夫特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
Run Code Online (Sandbox Code Playgroud)

您可能最初会发现这种方法更容易,但控制图像填充形状的方式并非易事.


Dav*_*ist 4

CAShapeLayer 不是这样工作的。您将创建一个以图像作为其内容的普通 CALayer,然后使用形状图层作为该图层的蒙版来实现您想要的效果。