如果我创建一个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,然后使用形状的层即层掩模板来实现你后的效果。
[注:更新为夫特2.2和SWIFT 3]
快速回答:使用的CALayer
如在解释CAShapeLayer类参考 ,一个CAShapeLayer
用于使用自定义路径绘制形状。 设置图像作为其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
?”
有两个解决方案,我建议你试试:
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
您可能会发现在第一次这种方法更容易,但控制图像填满你的体形的方式是不平凡的。
你可以得到图像通过设置出现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];