Mengapa lapisan asli kehilangan topengnya saat disalin?

Ketika saya mencoba menyalin objek dari Kelas Lapisan Kustom yang saya buat, salinan yang dibuat cocok dengan aslinya, tetapi yang asli kehilangan topengnya.

Untuk melakukan penyalinan, saya telah membuat ekstensi kelas khusus saya:

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
    }
}

Saya kemudian membuat salinannya dengan cara ini:

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

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

Seperti yang dapat Anda lihat dari tangkapan layar, lapisan asli tidak lagi memiliki topeng sementara salinannya memilikinya.

Atas: lapisan asli / Bawah: lapisan salinan

Saya telah menggunakan metode ini di masa lalu untuk Kelas Lapisan Kustom lainnya dan saya belum pernah mengalami masalah ini sampai sekarang. Saya juga telah mencoba membuat CALayer yang merupakan turunan dari self.mask dan kemudian menerapkannya sebagai topeng pada salinannya, tetapi hasilnya sama.

Setiap petunjuk akan sangat dihargai!

Terima kasih sebelumnya atas waktu Anda!


person Chris    schedule 30.12.2018    source sumber


Jawaban (1)


Intuisi saya memberi tahu saya bahwa Anda mungkin harus menyalin topeng dalam implementasi penyalinan Anda. Saya menemukan pertanyaan ini yang mendukung intuisi saya.

Dapatkah satu CALayer digunakan sebagai masker untuk beberapa lapisan lainnya?

person Joe VB    schedule 30.12.2018
comment
Terima kasih atas balasan Anda @Joe. Di utas yang Anda tunjukkan, dikatakan untuk menggunakan Lapisan CA yang sama dengan masker untuk beberapa lapisan, oleh karena itu saya dapat melihat mengapa itu tidak berhasil. Di sini saya sudah berada di dalam metode penyalinan dan saya gagal menghubungkan titik-titiknya. Terlebih lagi, segera setelah saya menggunakan self.mask meskipun saya tidak memasangkannya ke layer mask klon (misalkan saya membuat CALayer lain dan menyetelnya ke self.mask), salinan asli menyetel topengnya ke nil. Terakhir, metode penyalinan yang saya gunakan berfungsi untuk kelas khusus lainnya sedangkan menurut utasnya, metode tersebut seharusnya tidak berfungsi sama sekali... Oleh karena itu mengapa saya bingung. - person Chris; 30.12.2018