Komponen ui khusus iPhone

Saya sangat baru dalam pengembangan iPhone.

Saya ingin membuat komponen ui yang dapat berisi persegi, lingkaran, atau segitiga. Saya akan meneruskan parameter ke konstruktornya untuk menentukan bentuk apa yang saya inginkan.

Saya ingin objek ini dapat digerakkan dengan acelerometer atau dengan jari pengguna. Saya juga ingin membuatnya lebih besar atau lebih kecil.

Saya berpikir untuk membuat komponen UI khusus yang mewarisi UIView.

Saya tidak tahu apakah saya menggambar bentuk dengan Quartz 2D itu akan berperilaku seperti Komponen UI.

Bisakah saya melakukan itu? Apakah Anda memiliki solusi yang lebih baik?


person VansFannel    schedule 03.03.2011    source sumber


Jawaban (2)


Saya pikir solusi sederhana dan teratur adalah subkelas UIView. Apa yang akan Anda lakukan.

Secara konseptual, UIView mempertahankan konten visualnya dengan menggambarnya. (dengan Quartz dalam banyak kasus!) Jika konten visual berubah? UIView cukup gambar ulang saja. Saat Anda mengubah apa pun, UIView menggambar ulang semuanya. (Tentu saja, ini adalah deskripsi konseptual, yang sebenarnya jauh berbeda karena ada banyak optimasi)

Namun poin pentingnya adalah apa yang harus Anda lakukan untuk ini hanyalah mengesampingkan sebuah metode. Karena UIKit melakukan sebagian besar pengoptimalan penting, bukan Anda.

UIView menggambar konten visualnya dengan metode - (void)drawRect:(CGRect)rect. Dan Anda dapat mengganti metode ini untuk menggambar bentuk Anda. Jika Anda menggambar sesuatu dengan metode ini, bentuknya akan tergambar pada tampilan transparan.

Jika Anda memanipulasi tampilan (menskalakan, memindahkan, memutar...) UIKit dapat meminta tampilan untuk menggambar ulang grafiknya. Dan, tampilan akan mengingat metode menggambar bentuk Anda. Ini adalah teknik yang sangat teratur. Sebagian besar grafik dan animasi khusus dibuat dengan metode ini. Yang perlu Anda lakukan hanyalah menulis kode gambar pada metode - (void)drawRect:(CGRect)rect.

Ada panduan bagus tentang konsep ini pada dokumentasi referensi:

Dan berhati-hatilah karena Anda harus menggambar dengan CGContextRef yang diambil dengan memanggil metode UIGraphicsGetCurrentContext ( void ); alih-alih membuatnya sendiri. Konteksnya berarti layar perangkat sebenarnya. Jika Anda membuat konteks Anda sendiri, tidak satupun dari mereka dapat menawarkan layar perangkat yang sebenarnya.

Sebagai contoh:

@interface MyView : UIView
@end

@implementation MyView
- (void)drawRect:(CGRect)rect
{
    CGContextRef context = UIGraphicsGetCurrentContext();
    // Do your drawing here with the `context`.
    // And don't release it because the it is not yours, just borrowed from `UIKit`.
}
@end

Mungkin Anda memerlukan semacam optimasi dalam bentuk apa pun. UIKit melakukan optimasi dasar tetapi tidak semuanya. Karena optimasi grafis memiliki banyak trade-off antara memori dan pemrosesan. Anda dapat memperoleh beberapa pengoptimalan dari CALayer dan shouldRasterize. Namun jika Anda membutuhkan lebih banyak, Anda harus mulai belajar tentang grafik real-time.

person eonil    schedule 03.03.2011
comment
@occulus Wah! Saya sangat dihargai! Itu selalu diterima untuk mengoreksi tata bahasa saya yang salah :) - person eonil; 03.03.2011
comment
@occulus: Sumber tata bahasa yang bagus! - person VansFannel; 03.03.2011

Tentu saja mungkin untuk menggambar tampilan khusus seperti yang dijelaskan oleh Eonil. Namun, apakah Anda sudah mempertimbangkan untuk menggunakan UIImageView saja?

person Jim    schedule 03.03.2011