如果我创建一个只有背景颜色的 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];
最佳答案
[注意:已更新至 Swift 2.2 和 Swift 3]
快速回答:使用 CALayer
如 CAShapeLayer Class Reference 中所述, CAShapeLayer
用于使用自定义路径绘制形状。将图像设置为它的内容
将被简单地忽略。
如果您只想在图层中显示图像(假设您的文件名为 image.png
),您可以使用 CALayer
并设置其 contents
属性,以便它引用图像的 CGImage
表示:
swift 2.2:
let layer = CALayer()
layer.contents = UIImage(named: "image")?.CGImage
swift 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
swift 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
swift 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
一开始您可能会发现这种方法更容易,但控制图像填充形状的方式一点也不简单。
关于objective-c - UIImage 作为 CAShapeLayer 的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11632200/