作为UIImage的内容CAShapeLayer(UIImage as CAShapeLayer c

2019-06-26 12:33发布

如果我创建一个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];

Answer 1:

CAShapeLayer不工作的方式。 您可以创建与图像作为其内容正常的CALayer,然后使用形状的层即层掩模板来实现你后的效果。



Answer 2:

[注:更新为夫特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

您可能会发现在第一次这种方法更容易,但控制图像填满你的体形的方式是不平凡的。



Answer 3:

你可以得到图像通过设置出现fillColor ,而不是contents

layer.fillColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"image"]].CGColor;


Answer 4:

layerName.contents = (id)[[UIImage imageNamed:@"img.PNG"] CGImage];


Answer 5:

你必须设置CGImage的层

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


文章来源: UIImage as CAShapeLayer contents