Meskipun pertanyaan menyatakan secara pemrograman, setelah mengalami masalah yang sama, dan lebih suka bekerja di Interface Builder, saya pikir mungkin berguna untuk menambahkan jawaban yang ada dengan solusi Interface Builder.
Hal pertama yang harus dilupakan sizeToFit
. Tata Letak Otomatis akan menangani ini atas nama Anda berdasarkan pada ukuran konten intrinsik.
Masalahnya adalah, bagaimana cara mendapatkan label agar sesuai dengan kontennya dengan Tata Letak Otomatis? Khususnya - karena pertanyaan menyebutkannya - tinggi. Perhatikan bahwa prinsip yang sama berlaku untuk lebar.
Jadi mari kita mulai dengan contoh UILabel yang memiliki tinggi diatur ke tinggi 41px:
Seperti yang dapat Anda lihat di layar ambil di atas, "This is my text"
memiliki bantalan di atas dan di bawah. Itu adalah padding di antara ketinggian UILabel, dan isinya, teks.
Jika kami menjalankan aplikasi di simulator, tentu saja, kami melihat hal yang sama:
Sekarang, mari kita pilih label UIL di Interface Builder, dan lihat pengaturan default di inspektur Ukuran:
Perhatikan kendala yang disorot di atas. Itulah Prioritas Memeluk Konten . Seperti yang dijelaskan Erica Sadun dalam iOS Auto Layout Demystified , ini adalah:
cara tampilan lebih suka untuk menghindari bantalan tambahan di sekitar konten inti itu
Bagi kami, dengan UILabel, konten intinya adalah teks.
Di sini kita sampai pada inti dari skenario dasar ini. Kami telah memberi dua batasan pada label teks kami. Mereka saling bertentangan. Seseorang mengatakan "tingginya harus sama dengan tinggi 41 piksel" . Yang lain mengatakan "memeluk tampilan untuk konten itu sehingga kami tidak memiliki bantalan tambahan" . Dalam kasus kami, peluk tampilan ke teks itu sehingga kami tidak memiliki bantalan tambahan.
Sekarang, dengan Tata Letak Otomatis, dengan dua instruksi berbeda yang mengatakan melakukan hal yang berbeda, runtime harus memilih satu atau yang lain. Tidak bisa melakukan keduanya. UILabel tidak boleh memiliki tinggi 41 piksel, dan tidak memiliki bantalan.
Cara ini diselesaikan, adalah dengan menentukan prioritas. Satu instruksi harus memiliki prioritas yang lebih tinggi daripada instruksi lainnya. Jika kedua instruksi mengatakan hal yang berbeda, dan memiliki prioritas yang sama, pengecualian akan terjadi.
Jadi mari kita mencobanya. Batasan tinggi badan saya memiliki prioritas 1000 , yang diperlukan . Tinggi konten memeluk adalah 250 , yang lemah . Apa yang terjadi jika kita mengurangi prioritas batasan ketinggian menjadi 249 ?
Sekarang kita bisa melihat keajaiban mulai terjadi. Mari kita coba di sim:
Luar biasa! Pelukan konten tercapai. Hanya karena prioritas tinggi 249 kurang dari prioritas konten yang dipeluk 250 . Pada dasarnya, saya katakan "ketinggian yang saya tentukan di sini kurang penting daripada apa yang saya tentukan untuk memeluk konten" . Jadi, konten yang dipeluk menang.
Intinya, mendapatkan label agar sesuai dengan teks dapat sesederhana menetapkan batasan tinggi - atau lebar, dan memperbaiki pengaturan yang diprioritaskan terkait dengan kendala prioritas memeluk konten sumbu.
Akan meninggalkan melakukan yang setara dengan lebar sebagai latihan untuk pembaca!
label.sizeToFit()
Xcode / viewController, batasannya sudah cukup. tidak membuat label di Playground . Sejauh ini satu-satunya cara saya menemukannya untuk bekerja di Playground adalah dengan melakukanlabel.sizeToFit()