Apple mendefinisikan dengan jelas cara subkelas UIView
dalam dokumen.
Lihatlah daftar di bawah ini, terutama lihat initWithFrame:
dan layoutSubviews
. Yang pertama dimaksudkan untuk mengatur bingkai AndaUIView
sedangkan yang kedua dimaksudkan untuk mengatur frame dan tata letak subview-nya.
Ingat juga bahwa initWithFrame:
ini dipanggil hanya jika Anda membuat instance UIView
program Anda . Jika Anda memuatnya dari file nib (atau storyboard), initWithCoder:
akan digunakan. Dan dalam initWithCoder:
bingkai belum dihitung, jadi Anda tidak dapat mengubah bingkai yang Anda atur di Interface Builder. Seperti yang disarankan dalam jawaban ini, Anda mungkin berpikir untuk menelepon initWithFrame:
dariinitWithCoder:
untuk mengatur bingkai.
Akhirnya, jika Anda memuat UIView
dari nib (atau storyboard), Anda juga memiliki awakeFromNib
kesempatan untuk melakukan inisialisasi bingkai dan tata letak khusus, sejak saatawakeFromNib
disebut dijamin bahwa setiap tampilan dalam hierarki telah diarsipkan dan diinisialisasi.
Dari doc of NSNibAwaking
(sekarang digantikan oleh doc of awakeFromNib
):
Pesan ke objek lain dapat dikirim dengan aman dari dalam awakeFromNib — saat itu dipastikan bahwa semua objek tidak diarsipkan dan diinisialisasi (walaupun tidak harus dibangunkan, tentu saja)
Perlu juga dicatat bahwa dengan autolayout Anda tidak harus secara eksplisit mengatur bingkai pandangan Anda. Alih-alih, Anda seharusnya menentukan serangkaian kendala yang cukup, sehingga frame secara otomatis dihitung oleh mesin tata letak.
Langsung dari dokumentasi :
Metode untuk Mengesampingkan
Inisialisasi
initWithFrame:
Anda disarankan untuk menerapkan metode ini. Anda juga dapat menerapkan metode inisialisasi khusus selain, atau bukannya, metode ini.
initWithCoder:
Terapkan metode ini jika Anda memuat tampilan Anda dari file nib Interface Builder dan tampilan Anda memerlukan inisialisasi khusus.
layerClass
Terapkan metode ini hanya jika Anda ingin tampilan Anda menggunakan layer Core Animation berbeda untuk backing store-nya. Misalnya, jika Anda menggunakan OpenGL ES untuk melakukan menggambar, Anda ingin mengganti metode ini dan mengembalikan kelas CAEAGLLayer.
Menggambar dan mencetak
drawRect:
Terapkan metode ini jika tampilan Anda menarik konten khusus. Jika tampilan Anda tidak membuat gambar khusus, hindari mengganti metode ini.
drawRect:forViewPrintFormatter:
Terapkan metode ini hanya jika Anda ingin menggambar konten tampilan Anda secara berbeda saat mencetak.
Kendala
requiresConstraintBasedLayout
Terapkan metode kelas ini jika kelas tampilan Anda membutuhkan kendala untuk berfungsi dengan baik.
updateConstraints
Terapkan metode ini jika tampilan Anda perlu membuat batasan khusus di antara tampilan bawah Anda.
alignmentRectForFrame:
, frameForAlignmentRect:
Terapkan metode ini untuk menimpa bagaimana pandangan Anda selaras dengan tampilan lain.
Tata letak
sizeThatFits:
Terapkan metode ini jika Anda ingin tampilan Anda memiliki ukuran default yang berbeda dari biasanya selama operasi pengubahan ukuran. Misalnya, Anda mungkin menggunakan metode ini untuk mencegah tampilan Anda menyusut ke titik di mana subview tidak dapat ditampilkan dengan benar.
layoutSubviews
Terapkan metode ini jika Anda memerlukan kontrol yang lebih tepat atas tata letak subview Anda daripada yang disediakan oleh perilaku kendala atau autoresizing.
didAddSubview:
, willRemoveSubview:
Terapkan metode ini sesuai kebutuhan untuk melacak penambahan dan penghapusan subview.
willMoveToSuperview:
, didMoveToSuperview
Terapkan metode ini sesuai kebutuhan untuk melacak pergerakan tampilan saat ini dalam hierarki tampilan Anda.
willMoveToWindow:
, didMoveToWindow
Terapkan metode ini sesuai kebutuhan untuk melacak pergerakan tampilan Anda ke jendela yang berbeda.
Penanganan Acara:
touchesBegan:withEvent:
, touchesMoved:withEvent:
, touchesEnded:withEvent:
, touchesCancelled:withEvent:
Melaksanakan metode ini jika Anda perlu untuk menangani peristiwa sentuhan langsung. (Untuk input berbasis gerakan, gunakan pengenal isyarat.)
gestureRecognizerShouldBegin:
Terapkan metode ini jika tampilan Anda menangani acara sentuh secara langsung dan mungkin ingin mencegah pengenal gerakan terlampir memicu tindakan tambahan.