Apa perbedaan antara UIView dan CALayer?


103

Keduanya memiliki sebagian besar atribut yang sama, keduanya mendukung jenis animasi yang berbeda, keduanya mewakili data yang berbeda. Apa perbedaan antara UIView dan CALayer?

Jawaban:


224

Di iOS, setiap UIView didukung oleh Core Animation CALayer, jadi Anda berurusan dengan CALayers saat menggunakan UIView, meskipun Anda mungkin tidak menyadarinya. Tidak seperti NSViews di Mac, yang berevolusi sebelum Core Animation ada, UIViews dimaksudkan untuk menjadi pembungkus ringan di sekitar CALayers ini.

Seperti yang saya jelaskan dalam pertanyaan serupa "Kapan menggunakan CALayer di Mac / iPhone?" , bekerja secara langsung dengan CALayers tidak memberi Anda keunggulan kinerja yang signifikan dibandingkan UIViews. Salah satu alasan Anda mungkin ingin membuat elemen antarmuka pengguna dengan CALayers daripada UIViews adalah karena elemen tersebut dapat dengan mudah di-porting ke Mac. UIViews sangat berbeda dari NSViews, tetapi CALayers hampir identik pada kedua platform tersebut. Inilah sebabnya mengapa kerangka kerja Core Plot meletakkan grafiknya menggunakan CALayers alih-alih elemen UI lainnya.

Satu hal yang disediakan UIViews melalui CALayers adalah dukungan bawaan untuk interaksi pengguna. Mereka menangani pengujian hit pada sentuhan dan tindakan terkait lainnya yang perlu Anda bangun sendiri jika mengelola hierarki CALayers. Tidak sulit untuk menerapkannya sendiri, tetapi ini adalah kode tambahan yang perlu Anda tulis ketika membuat antarmuka khusus CALayer.

Anda akan sering perlu mengakses lapisan yang mendasari untuk UIView saat melakukan animasi yang lebih kompleks daripada yang diizinkan oleh kelas UIView dasar. Kemampuan animasi UIView telah berkembang seiring dengan kematangan iOS SDK, tetapi masih ada beberapa hal yang paling baik dilakukan dengan berinteraksi dengan CALayer yang mendasarinya.


40

Dari blog Ray Wenderlich ( Tutorial )

CALayers hanyalah kelas yang merepresentasikan persegi panjang di layar dengan konten visual. "Tapi tunggu sebentar," Anda mungkin berkata, "untuk itulah UIViews!" Itu benar, tetapi ada trik untuk itu: setiap UIView berisi lapisan root yang ditarik!


33

Sederhananya, UIView mewarisi dari UIResponder, menangani peristiwa dari pengguna, berisi CALayer, yang mewarisi dari NSObject, terutama berfokus pada rendering, animasi, dll.


7

UIViewadalah wadah untuk CALayers. Menggunakan UIKit.

CALayertempat kami menggambar isinya. MenggunakanCoreGraphics

Jika Anda bekerja dengan fitur seperti kontrol kustom, akan sangat bagus untuk melanjutkan dengan tampilan tunggal yang berisi lebih banyak lapisan untuk rendering asli yang akurat. Karena CALayerstidak berbobot dari UIView.

Untuk membuat kerangka umum untuk Mac dan iOS, ikuti desain yang digunakan aplikasi Anda CALayers. Karena tersedia di kedua platform.

UIViewmemiliki fitur seperti acara sentuh yang dicapai dengan menggunakan delegasi -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event, tochesStartseperti acara dan UIKitfitur lainnya .

Untuk bekerja dengan CALayersmenggunakan pengetahuan Core Graphics. Untuk rendering tampilan sederhana saja UIViewsudah cukup.


0

Perbedaan besar adalah UIView dirancang untuk CocoaTouch di perangkat seluler. Ia menambahkan beberapa event handler yang tidak disediakan CALayer.


0

UIView: Tampilan memiliki tata letak hierarki yang lebih kompleks. Mereka dapat menerima interaksi pengguna seperti ketukan, cubitan, klik, dan lainnya. Bekerja dengan UIViews terjadi di thread utama, artinya menggunakan daya CPU.

CALayer: Di sisi lain, lapisan memiliki hierarki yang lebih sederhana. Itu berarti mereka lebih cepat menyelesaikannya dan lebih cepat menggambar di layar. Tidak ada overhead chain responder yang berbeda dengan views. Lapisan digambar langsung di GPU. Ini terjadi pada utas terpisah tanpa membebani CPU.

Untuk detail lebih lanjut: https://medium.com/@fassko/uiview-vs-calayer-b55d932ff1f5

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.