为什么原始图层在复制时会丢失其遮罩?

时间:2018-12-30 00:56:11

标签: ios calayer mask deep-copy

当我尝试从创建的“自定义图层类”中复制对象时,创建的副本与原始对象匹配,但是原始对象会失去其蒙版。

为了执行复制,我创建了自定义类的扩展:

extension CustomLayer: NSCopying {

    func copy(with zone: NSZone? = nil) -> Any {
        let clone = CustomLayer()

        // Type Properties
        clone.colorFill             = self.colorFill
        clone.colorMap              = self.colorMap
        clone.radius                = self.radius

        // LayerProperties
        clone.frame                 = self.frame
        clone.cornerRadius          = self.cornerRadius
        clone.opacity               = self.opacity
        clone.position              = self.position

        clone.shadowRadius          = self.shadowRadius
        clone.shadowColor           = self.shadowColor
        clone.shadowOffset          = self.shadowOffset
        clone.shadowOpacity         = self.shadowOpacity
        clone.shadowPath            = self.shadowPath 

        clone.mask                  = self.mask

        return clone
    }
}

然后我用这种方式创建一个副本:

let originalLayer = CustomLayer()
...
view.layer.addSublayer(originalLayer)

let copyLayer = originalLayer.copy() as! CustomLayer
view.layer.addSublayer(copyLayer)

从屏幕快照中可以看到,副本中的原始图层不再具有蒙版。

Top: original layer / Bottom: copy layer

我过去在其他自定义图层类中使用过此方法,但直到现在我都从未遇到过此问题。我还尝试创建一个CALayer实例的self.mask,然后将其作为掩码应用于副本,但是结果是相同的。

任何指针将不胜感激!

提前感谢您的时间!

1 个答案:

答案 0 :(得分:0)

我的直觉告诉我,您可能必须在复制实现中复制掩码。我发现这个问题支持我的直觉。

Can a single CALayer be used as the mask for multiple other layers?