Sumber: http://www.objc.io/issue-3/advanced-auto-layout-toolbox.html
Ukuran Konten Intrinsik dari Teks Multi-Baris
Ukuran konten intrinsik dari UILabel dan NSTextField ambigu untuk teks multi-baris. Ketinggian teks tergantung pada lebar garis, yang belum ditentukan saat menyelesaikan kendala. Untuk mengatasi masalah ini, kedua kelas memiliki properti baru yang disebut preferMaxLayoutWidth, yang menentukan lebar garis maksimum untuk menghitung ukuran konten intrinsik.
Karena kita biasanya tidak mengetahui nilai ini sebelumnya, kita perlu mengambil pendekatan dua langkah untuk mendapatkan ini dengan benar. Pertama kita membiarkan Tata Letak Otomatis melakukan tugasnya, dan kemudian kita menggunakan bingkai yang dihasilkan dalam tata letak lulus untuk memperbarui lebar maksimum yang diinginkan dan memicu tata letak lagi.
- (void)layoutSubviews
{
[super layoutSubviews];
myLabel.preferredMaxLayoutWidth = myLabel.frame.size.width;
[super layoutSubviews];
}
Panggilan pertama ke [super layoutSubviews] diperlukan untuk label untuk mengatur frame-nya, sementara panggilan kedua diperlukan untuk memperbarui tata letak setelah perubahan. Jika kami mengabaikan panggilan kedua, kami mendapatkan kesalahan NSInternalInconsistencyException, karena kami telah membuat perubahan dalam tata letak pass yang membutuhkan pembaruan kendala, tetapi kami tidak memicu tata letak lagi.
Kita juga bisa melakukan ini di label subclass itu sendiri:
@implementation MyLabel
- (void)layoutSubviews
{
self.preferredMaxLayoutWidth = self.frame.size.width;
[super layoutSubviews];
}
@end
Dalam hal ini, kita tidak perlu memanggil [super layoutSubviews] terlebih dahulu, karena ketika layoutSubviews dipanggil, kita sudah memiliki bingkai pada label itu sendiri.
Untuk melakukan penyesuaian ini dari level controller tampilan, kami menghubungkan ke viewDidLayoutSubviews. Pada titik ini frame dari lintasan Tata Letak Otomatis pertama telah ditetapkan dan kita dapat menggunakannya untuk mengatur lebar maksimum yang diinginkan.
- (void)viewDidLayoutSubviews
{
[super viewDidLayoutSubviews];
myLabel.preferredMaxLayoutWidth = myLabel.frame.size.width;
[self.view layoutIfNeeded];
}
Terakhir, pastikan Anda tidak memiliki batasan ketinggian eksplisit pada label yang memiliki prioritas lebih tinggi daripada prioritas resistensi kompresi konten label. Kalau tidak, itu akan mengalahkan tinggi konten yang dihitung. Pastikan untuk memeriksa semua kendala yang dapat memengaruhi ketinggian label.