Sekarang, Interface Builder memungkinkan pengguna mengubah ukuran setiap pengontrol tampilan di storyboard secara dinamis, untuk mensimulasikan ukuran perangkat tertentu.
Sebelum fungsionalitas ini, pengguna harus mengatur secara manual setiap ukuran pengontrol tampilan. Jadi pengontrol tampilan disimpan dengan ukuran tertentu, yang digunakan initWithCoder
untuk mengatur frame awal.
Sekarang, tampaknya initWithCoder
tidak menggunakan ukuran yang ditentukan di storyboard, dan menentukan ukuran 1000x1000 px untuk tampilan viewcontroller & semua subviewnya.
Ini bukan masalah, karena tampilan harus selalu menggunakan salah satu dari solusi tata letak berikut:
autolayout, dan semua batasan akan mengatur tampilan Anda dengan benar
autoresizingMask, yang akan mengatur tata letak setiap tampilan yang tidak memiliki batasan apa pun yang dilampirkan ( catatan autolayout dan batasan margin sekarang kompatibel dalam tampilan yang sama \ o /! )
Tapi ini dia masalah untuk semua hal tata letak yang terkait dengan lapisan tampilan, seperti cornerRadius
, karena tata letak otomatis maupun topeng otomatis tidak berlaku untuk properti lapisan.
Untuk menjawab masalah ini, cara yang umum adalah menggunakan viewDidLayoutSubviews
jika Anda berada di controller, atau layoutSubview
jika Anda dalam tampilan. Pada titik ini (jangan lupa untuk memanggil super
metode relatifnya), Anda cukup yakin bahwa semua tata letak telah selesai!
Cukup yakin? Hum ... tidak sepenuhnya, saya telah berkomentar, dan itulah mengapa saya menanyakan pertanyaan ini, dalam beberapa kasus tampilan masih memiliki ukuran 1000x1000 pada metode ini. Saya pikir tidak ada jawaban untuk pertanyaan saya sendiri. Untuk memberikan informasi yang maksimal tentangnya:
1- Itu terjadi hanya saat meletakkan sel! Dalam UITableViewCell
& UICollectionViewCell
subkelas,layoutSubview
tidak akan dipanggil setelah tampilan ditata dengan benar.
2- Seperti yang dikatakan @EugenDimboiu (tolong beri suara positif pada jawabannya jika berguna untuk Anda), menelepon [myView layoutIfNeeded]
subview yang tidak ditata akan mengaturnya dengan benar tepat pada waktunya.
- (void)layoutSubviews {
[super layoutSubviews];
NSLog (self.myLabel); // 1000x1000 size
[self.myLabel layoutIfNeeded];
NSLog (self.myLabel); // normal size
}
3- Menurut saya, ini pasti bug. Saya telah mengirimkannya ke radar (id 28562874).
PS: Saya bukan penutur asli bahasa Inggris, jadi silakan mengedit posting saya jika tata bahasa saya harus diperbaiki;)
PS2: Jika ada solusi yang lebih baik, jangan ragu untuk menulis jawaban lain. Saya akan memindahkan jawaban yang diterima.