เหตุใดเลเยอร์ดั้งเดิมจึงสูญเสียมาสก์เมื่อถูกคัดลอก

เมื่อฉันพยายามคัดลอกออบเจ็กต์จากคลาสเลเยอร์แบบกำหนดเองที่ฉันสร้างขึ้น สำเนาที่สร้างขึ้นนั้นตรงกับต้นฉบับ แต่ต้นฉบับสูญเสียการมาสก์ไป

เพื่อดำเนินการคัดลอก ฉันได้สร้างส่วนขยายของคลาสที่กำหนดเองของฉัน:

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)

ดังที่คุณเห็นจากภาพหน้าจอ เลเยอร์ดั้งเดิมไม่มีมาสก์อีกต่อไปในขณะที่สำเนามีอยู่

ด้านบน: เลเยอร์ดั้งเดิม / ด้านล่าง: คัดลอกเลเยอร์

ฉันเคยใช้วิธีนี้กับ Custom Layer Class อื่นๆ มาก่อน และฉันไม่เคยพบปัญหานี้เลยจนกระทั่งตอนนี้ ฉันได้ลองสร้าง CALayer ที่เป็นอินสแตนซ์ของ self.mask แล้วใช้มันเป็นมาสก์กับสำเนา แต่ผลลัพธ์ก็เหมือนเดิม

พอยน์เตอร์ใด ๆ จะได้รับการชื่นชมอย่างมาก!

ขอขอบคุณล่วงหน้าสำหรับเวลาของคุณ!


person Chris    schedule 30.12.2018    source แหล่งที่มา


คำตอบ (1)


สัญชาตญาณของฉันบอกฉันว่าคุณอาจต้องคัดลอกมาสก์ในการใช้งานการคัดลอกของคุณ ฉันพบคำถามนี้ที่สนับสนุนสัญชาตญาณของฉัน

สามารถใช้ CALayer ตัวเดียวได้หรือไม่ เป็นมาส์กสำหรับเลเยอร์อื่นๆ อีกหลายเลเยอร์

person Joe VB    schedule 30.12.2018
comment
ขอบคุณสำหรับคำตอบของคุณ @Joe ในกระทู้ที่คุณระบุ มันบอกว่าให้ใช้ CA Layer เดียวกันเป็นมาสก์สำหรับหลายเลเยอร์ ดังนั้นฉันจึงเข้าใจได้ว่าทำไมมันถึงใช้งานไม่ได้ ที่นี่ฉันอยู่ในวิธีการคัดลอกอยู่แล้ว และฉันไม่สามารถเชื่อมต่อจุดต่างๆ ได้ นอกจากนี้ ทันทีที่ฉันใช้ self.mask แม้ว่าฉันจะไม่ได้แนบมันเข้ากับโคลนเลเยอร์มาสก์ (สมมติว่าฉันสร้าง CALayer อีกอันและตั้งค่าเป็น self.mask) สำเนาต้นฉบับจะตั้งค่ามาสก์เป็น nil สุดท้ายแต่ไม่ท้ายสุด วิธีการคัดลอกที่ฉันใช้ใช้ได้กับคลาสแบบกำหนดเองอื่น ๆ ในขณะที่ตามเธรดนั้นไม่ควรได้ผลเลย... ดังนั้นทำไมฉันถึงงง - person Chris; 30.12.2018