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];