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