我正在尝试在CAShapeLayer
层中嵌套的UIView
内部渲染静态图像。形状的所有装饰(即边框,颜色,路径等)在视图中均正确呈现。
但是,为CGImage
属性提供的CALayer.contents
在任何时候都不会在视图中呈现(据我所知)。我一直试图弄清楚这种行为,并被Apple的文档所困扰:
如果您正在使用图层显示静态图像,则可以将此属性设置为包含要显示的图像的CGImage 。...此属性的值会导致图层使用您的图像,而不是创建单独的后备存储。
如果图层对象绑定到视图对象,则应避免直接设置此属性的内容。视图和图层之间的相互作用通常会导致视图在后续更新期间替换此属性的内容。
很高兴知道!这可能正是这种情况下发生的事情:UIView正在更新和替换其内容。除非提供的解决方法不是很清楚,而且我无法找到解决此问题的示例。
有人对如何在CAShapeLayer上设置静态图像“间接” 并避免被超级视图删除(几乎立即删除)提出任何建议?
答案 0 :(得分:0)
起初,我以为您无法将映像安装到CAShapeLayer的内容中并使其起作用,但是我错了。确实有效。考虑以下代码:
class ImageWithShapeView: UIView {
let shapeLayer = CAShapeLayer()
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
layer.borderWidth = 1.0
shapeLayer.frame = self.bounds
//Load an image into the shape layer's contents property.
if let image = UIImage(named: "WareToLogo") {
shapeLayer.contents = image.cgImage
layer.addSublayer(shapeLayer)
}
let path = UIBezierPath()
shapeLayer.lineWidth = 2.0
shapeLayer.strokeColor = UIColor.blue.cgColor
shapeLayer.fillColor = UIColor.clear.cgColor
let radius = (bounds.midX + bounds.midY) / 4.0
path.addArc(withCenter: CGPoint(x: bounds.midX, y: bounds.midY), radius: radius, startAngle: 0, endAngle: CGFloat.pi * 2, clockwise: true)
path.move(to: CGPoint(x:0, y:0))
path.addLine(to: CGPoint(x: bounds.width, y: bounds.height))
path.move(to: CGPoint(x: bounds.width, y: 0))
path.addLine(to: CGPoint(x: 0, y: bounds.height))
shapeLayer.path = path.cgPath
}
}
这可行,并且在我向项目中添加ImageWithShapeView
时创建以下内容。 (我使用的是情节提要,所以我实现了UIView.init(coder:)
。如果要在代码中创建视图,则可能要改为实现UIView.init(frame:)
)