อะไรคือความแตกต่างระหว่าง UIView และ CALayer?


103

ทั้งสองมีแอตทริบิวต์ส่วนใหญ่เหมือนกันทั้งสองสนับสนุนภาพเคลื่อนไหวประเภทต่างๆทั้งคู่แสดงข้อมูลที่แตกต่างกัน อะไรคือความแตกต่างระหว่าง UIView และ CALayer?

คำตอบ:


224

บน iOS UIView ทุกตัวได้รับการสนับสนุนโดย Core Animation CALayer ดังนั้นคุณจึงต้องรับมือกับ CALayers เมื่อใช้ UIView แม้ว่าคุณจะไม่รู้ตัวก็ตาม ซึ่งแตกต่างจาก NSViews บน Mac ซึ่งพัฒนาขึ้นก่อนที่ Core Animation จะมีอยู่ UIViews มีจุดมุ่งหมายให้เป็นเครื่องห่อหุ้มน้ำหนักเบารอบ ๆ CALayers เหล่านี้

ตามที่ฉันอธิบายไว้ในคำถามที่คล้ายกัน"เมื่อใดควรใช้ CALayer บน Mac / iPhone" การทำงานโดยตรงกับ CALayers ไม่ได้ให้ข้อได้เปรียบด้านประสิทธิภาพที่สำคัญเหนือ UIViews เหตุผลประการหนึ่งที่คุณอาจต้องการสร้างองค์ประกอบส่วนติดต่อผู้ใช้ด้วย CALayers แทน UIViews คือสามารถย้ายไปยัง Mac ได้อย่างง่ายดาย UIViews แตกต่างจาก NSViews มาก แต่ CALayers นั้นแทบจะเหมือนกันบนทั้งสองแพลตฟอร์ม นี่คือเหตุผลที่กรอบงาน Core Plot วางกราฟโดยใช้ CALayers แทนองค์ประกอบ UI อื่น ๆ

สิ่งหนึ่งที่ UIViews มอบให้กับ CALayers คือการสนับสนุนในตัวสำหรับการโต้ตอบกับผู้ใช้ พวกเขาจัดการการทดสอบการกดบนการสัมผัสและการกระทำอื่น ๆ ที่เกี่ยวข้องซึ่งคุณจะต้องสร้างขึ้นเองหากจัดการลำดับชั้นของ CALayers การติดตั้งด้วยตัวเองไม่ใช่เรื่องยาก แต่เป็นโค้ดพิเศษที่คุณต้องเขียนเมื่อสร้างอินเทอร์เฟซ CALayer เท่านั้น

คุณมักจะต้องเข้าถึงเลเยอร์พื้นฐานสำหรับ UIView เมื่อแสดงภาพเคลื่อนไหวที่ซับซ้อนมากกว่าที่คลาส UIView พื้นฐานอนุญาต ความสามารถด้านแอนิเมชั่นของ UIView เติบโตขึ้นเมื่อ iOS SDK ครบกำหนดแล้ว แต่ยังมีบางสิ่งที่ทำได้ดีที่สุดโดยการโต้ตอบกับ CALayer ที่อยู่เบื้องหลัง


40

จากบล็อก Ray Wenderlich ( บทช่วยสอน )

CALayers เป็นเพียงชั้นเรียนที่แสดงถึงรูปสี่เหลี่ยมผืนผ้าบนหน้าจอที่มีเนื้อหาภาพ “ แต่เดี๋ยวก่อน” คุณอาจพูดว่า“ นั่นคือสิ่งที่ UIViews มีไว้สำหรับ!” นั่นเป็นความจริง แต่มีเคล็ดลับอยู่ที่: UIView ทุกตัวจะมีเลเยอร์รูทที่ดึงมาให้!


33

พูดง่ายๆ UIView รับช่วงจาก UIResponder จัดการเหตุการณ์จากผู้ใช้มี CALayer ซึ่งสืบทอดมาจาก NSObject เน้นการเรนเดอร์ภาพเคลื่อนไหวเป็นหลัก


7

UIViewCALayersเป็นภาชนะสำหรับ การใช้UIKit.

CALayerที่เราวาดเนื้อหา การใช้CoreGraphics

หากคุณทำงานกับการควบคุมแบบกำหนดเองเช่นคุณลักษณะต่างๆจะเป็นการดีที่จะดำเนินการต่อด้วยมุมมองเดียวที่มีเลเยอร์เพิ่มเติมเพื่อการแสดงผลเนทีฟที่แม่นยำ เนื่องจากมีน้ำหนักกว่าCALayersUIView

ในการสร้างโครงกระดูกที่พบบ่อยสำหรับ Mac และ iOS CALayersทำตามการออกแบบสำหรับแอปโดยใช้ เนื่องจากมีให้บริการในทั้งสองแพลตฟอร์ม

UIViewมีคุณสมบัติเช่นกิจกรรมสัมผัสทำได้โดยใช้ผู้ได้รับมอบหมาย-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event, tochesStartเช่นเหตุการณ์และอื่น ๆUIKitคุณสมบัติ

ในการทำงานโดยCALayersใช้ความรู้เกี่ยวกับCore Graphics สำหรับการแสดงผลมุมมองอย่างง่ายUIViewก็เพียงพอแล้ว


0

ความแตกต่างที่สำคัญคือ UIView ออกแบบมาสำหรับ CocoaTouch บนอุปกรณ์มือถือ เพิ่มตัวจัดการเหตุการณ์ที่ CALayer ไม่มีให้


0

UIView:มุมมองมีเค้าโครงลำดับชั้นที่ซับซ้อนมากขึ้น พวกเขาสามารถรับการโต้ตอบของผู้ใช้เช่นการแตะการบีบคลิคและอื่น ๆ การทำงานกับ UIViews เกิดขึ้นบนเธรดหลักหมายความว่ากำลังใช้พลังงาน CPU

CALayer:เลเยอร์ในทางกลับกันมีลำดับชั้นที่ง่ายกว่า นั่นหมายความว่าจะแก้ไขได้เร็วขึ้นและวาดบนหน้าจอได้เร็วขึ้น ไม่มีค่าใช้จ่ายของห่วงโซ่การตอบสนองซึ่งแตกต่างจากมุมมอง เลเยอร์ถูกวาดโดยตรงบน GPU มันเกิดขึ้นในเธรดแยกต่างหากโดยไม่ทำให้ CPU เป็นภาระ

สำหรับรายละเอียดเพิ่มเติม: https://medium.com/@fassko/uiview-vs-calayer-b55d932ff1f5

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.