objective-c - UIImage 作为 CAShapeLayer 的内容

标签 objective-c ios core-animation

如果我创建一个只有背景颜色的 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/

相关文章:

objective-c - iOS 内存管理 : to release a string or not?

iphone - 在 settings.bundle 中指定不可编辑的字符串?

iphone - 在HelloWorld iPhone应用程序之后,如何转到应用程序以处理WAV文件

ios - 应用了平移变换,但只添加了缩放变换

ios - 为什么这个 UIImageView 动画会泄漏?

objective-c - 当我禁用按钮时,有没有办法防止文本变成灰色?

ios - 将数组字符串对象转换为 float

ios - Swift 2 : Call can throw, 但未标记为 'try' 错误未处理

ios - 如何以编程方式快速添加自定义 UIButton

core-animation - 使用核心动画闪烁 NSButton