Почему исходный слой теряет свою маску при копировании?

Когда я пытаюсь скопировать объект из созданного мной пользовательского класса слоев, созданная копия соответствует оригиналу, но оригинал теряет свою маску.

Чтобы выполнить копирование, я создал расширение своего пользовательского класса:

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)

Как вы можете видеть на скриншоте, исходный слой больше не имеет маски, в то время как у копии она есть.

Сверху: исходный слой / Снизу: копия слоя

Я использовал этот метод в прошлом для других пользовательских классов слоев, и я никогда не сталкивался с этой проблемой до сих пор. Я также попытался создать CALayer, который является экземпляром self.mask, а затем применил его как маску к копии, но результат тот же.

Любые указатели будут очень признательны!

Спасибо заранее за ваше время!


person Chris    schedule 30.12.2018    source источник


Ответы (1)


Моя интуиция подсказывает мне, что вам, вероятно, придется скопировать маску в вашей реализации копирования. Я нашел этот вопрос, который поддерживает мою интуицию.

Можно ли использовать один CALayer в качестве маски для нескольких других слоев?

person Joe VB    schedule 30.12.2018
comment
Спасибо за ваш ответ @Joe. В указанном вами потоке говорится об использовании одного и того же слоя CA в качестве масок для нескольких слоев, поэтому я понимаю, почему это не работает. Здесь я уже внутри метода копирования и не могу соединить точки. Кроме того, как только я использую self.mask, даже если я не прикрепляю его к маске слоя клона (скажем, я создаю еще один CALayer и устанавливаю для него значение self.mask), исходная копия устанавливает маску на nil. И последнее, но не менее важное: метод копирования, который я использую, работает для других пользовательских классов, тогда как, согласно потоку, он вообще не должен работать... Поэтому я озадачен. - person Chris; 30.12.2018