【问题标题】:Adding an image to a CAShapeLayer将图像添加到 CAShapeLayer
【发布时间】:2018-09-26 23:39:43
【问题描述】:

我正在尝试在嵌套在UIView 层中的CAShapeLayer 内渲染静态图像。形状的所有装饰(即边框、颜色、路径等)都可以在视图中正确渲染。

然而,为CALayer.contents 属性提供的CGImage 在任何时候都不会呈现在视图中(据我所知)。一段时间以来,我一直试图弄清楚这种行为,但对 Apple 的文档感到困惑:

如果您使用图层来显示静态图像,您可以将此属性设置为包含您要显示的图像的CGImage....此属性的值会导致图层使用您的图像,而不是创建单独的后备存储。

如果图层对象绑定到视图对象,您应该避免直接设置此属性的内容。视图和层之间的相互作用通常会导致视图在后续更新期间替换此属性的内容

很高兴知道!这可能正是这种情况下发生的情况:UIView 正在更新和替换其内容。除了提供的解决方法不是很清楚,而且我找不到解决此问题的示例。

任何人对如何在 CAShapeLayer 上设置静态图像'间接'有任何建议,并避免它被超级视图(几乎立即)删除?

【问题讨论】:

  • 据我所知。每个视图都有一个 calayer。然后您可以将您的形状图层添加到该图层。来自视图控制器的 Self.view.layer.addsublayer(myshapelayer)。那么你就不用担心内容问题了。请下次显示您的示例代码。所以我们可以更好地帮助您

标签: ios swift core-graphics core-animation cashapelayer


【解决方案1】:

起初我以为您无法将图像安装到 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:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-03
    • 1970-01-01
    相关资源
    最近更新 更多