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.
Gabriele Petronella
sumber
layoutSubviews
?Ini masih muncul tinggi di Google. Di bawah ini adalah contoh yang diperbarui untuk swift.
The
didLoad
Fungsi memungkinkan Anda menempatkan semua kode inisialisasi kustom Anda. Seperti yang disebutkan orang lain,didLoad
akan dipanggil ketika tampilan dibuat secara programatis melaluiinit(frame:)
atau ketika deserializer XIB menggabungkan templat XIB ke dalam tampilan Anda melaluiinit(coder:)
sumber
draw
metode?Ada ringkasan yang layak dalam dokumentasi Apple , dan ini tercakup dengan baik dalam kursus Stanford gratis yang tersedia di iTunes. Saya menyajikan versi TL; DR saya di sini:
Jika kelas Anda sebagian besar terdiri dari subview, tempat yang tepat untuk mengalokasikannya adalah dalam
init
metode. Untuk tampilan, ada duainit
metode berbeda yang bisa dipanggil, tergantung pada apakah tampilan Anda sedang dibuat dari kode atau dari nib / storyboard. Apa yang saya lakukan adalah menulissetup
metode saya sendiri , dan kemudian menyebutnya dari metodeinitWithFrame:
daninitWithCoder:
.Jika Anda melakukan menggambar khusus, Anda memang ingin menimpanya
drawRect:
pandangan Anda. Namun, jika tampilan khusus Anda sebagian besar merupakan wadah untuk subview, Anda mungkin tidak perlu melakukannya.Hanya ganti
layoutSubViews
jika Anda ingin melakukan sesuatu seperti menambah atau menghapus subview tergantung pada apakah Anda dalam orientasi potret atau lanskap. Kalau tidak, Anda harus bisa membiarkannya sendiri.sumber
layoutSubViews
, itu berhasil.layoutSubviews
dimaksudkan untuk mengatur bingkai pada tampilan anak, bukan pada tampilan itu sendiri.Sebab
UIView
, konstruktor yang ditunjuk biasanyainitWithFrame:(CGRect)frame
dan Anda harus mengatur frame di sana (atau diinitWithCoder:
), mungkin mengabaikan nilai frame yang diteruskan. Anda juga dapat memberikan konstruktor yang berbeda dan mengatur bingkai di sana.sumber
awakeFromNib