UIImage作为CAShapeLayer的内容

如果我创建一个仅显示背景颜色的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]; 

CAShapeLayer无法正常工作。 您可以创建一个普通的CALayer,将图像作为其内容,然后使用形状图层作为该图层的蒙版,以达到您所追求的效果。

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

快速回答:使用CALayer

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

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

Swift 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

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 

斯威夫特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

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 

斯威夫特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 

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

您可以通过设置fillColor而不是contents来显示图像:

 layer.fillColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"image"]].CGColor; 
 layerName.contents = (id)[[UIImage imageNamed:@"img.PNG"] CGImage]; 

您必须为图层设置CGImage

 leftDot.fillColor=[UIColor clearColor].CGColor ; [leftDot setContents:(__bridge id)[UIImage imageNamed: @"glow.png"].CGImage];