Her ne kadar soru programlı olarak aynı sorunla karşılaşmış ve Arayüz Oluşturucu'da çalışmayı tercih etse de, bir Arayüz Oluşturucu çözümü ile mevcut cevaplara eklemenin yararlı olabileceğini düşündüm.
İlk şey unutmak sizeToFit
. Otomatik Mizanpaj, asıl içerik boyutuna göre bunu sizin adınıza halleder.
Bu nedenle sorun, Otomatik Mizanpaj ile içeriğine uyacak bir etiket nasıl edinilir? Özellikle - sorudan bahsedildiği için - yükseklik. Aynı ilkelerin genişlik için de geçerli olduğunu unutmayın.
Şimdi yüksekliği 41 piksel yüksekliğe ayarlanmış bir örnek UILabel ile başlayalım:
Yukarıdaki ekranda gördüğünüz gibi, "This is my text"
üstte ve altta dolgu var. Bu, UILabel'ın yüksekliği ile içeriği, metin arasında bir dolgudur.
Uygulamayı simülatörde çalıştırırsak, yeterince eminim, aynı şeyi görüyoruz:
Şimdi, Interface Builder'da UILabel'i seçelim ve Boyut denetçisindeki varsayılan ayarlara göz atalım:
Yukarıdaki vurgulanan kısıtlamaya dikkat edin. Yani İçerik Hugging Önceliği . Erica Sadun'un mükemmel iOS Otomatik Yerleşim Demystified'de açıkladığı gibi , bu:
bir görünümün temel içeriği etrafında fazladan dolgu yapılmasını önleme biçimi
Bizim için, UILabel ile temel içerik metindir.
İşte bu temel senaryonun kalbine geliyoruz. Metin etiketimize iki kısıtlama getirdik. Çatışıyorlar. Biri "yükseklik 41 piksel yüksekliğe eşit olmalı" diyor . Diğeri ise "içeriğine bak, böylece fazladan dolgu yapmıyoruz" diyor . Bizim durumumuzda, görünümü fazladan doldurmak için metne sarın.
Şimdi, Otomatik Düzen ile, farklı şeyler yapın diyen iki farklı talimatla, çalışma zamanının birini veya diğerini seçmesi gerekir. İkisini birden yapamaz. UILabel 41 piksel yüksekliğinde olamaz ve dolgu içermez.
Bunun çözüm yolu, öncelik belirtmektir. Bir talimat diğerinden daha yüksek önceliğe sahip olmalıdır. Her iki talimat da farklı şeyler söylüyorsa ve aynı önceliğe sahipse, bir istisna oluşacaktır.
Hadi bir deneyelim. Boyum kısıt bir önceliğe sahiptir 1000 edilir gerekli . İçerik sarılma yüksekliği 250'dir ve bu zayıftır . Yükseklik sınırlama önceliğini 249'a düşürürsek ne olur ?
Şimdi büyünün gerçekleşmeye başladığını görebiliyoruz. Sim'de deneyelim:
Müthiş! İçerik sarılma sağlandı. Yalnızca yükseklik önceliği 249 , içerik sarılma önceliğinden 250 daha az olduğu için . Temel olarak, "Burada belirttiğim yükseklik, içerik sarılma için belirttiğimden daha az önemli" diyorum . Böylece, sarılma içeriği kazanır.
Alt satırda, etiketi metne sığdırmak, yükseklik veya genişlik kısıtlamasını belirtmek kadar basit olabilir ve bu eksenin o eksenin içerik öncelik önceliği kısıtlamasıyla ilişkili olarak doğru ayarını yapmak kadar basit olabilir.
Okuyucu için bir egzersiz olarak genişlik eşdeğerini yapmayı bırakacak!
label.sizeToFit()
Xcode / viewController kullanmak zorunda değildi , kısıtlamalar yeterliydi. Playground'da etiket oluşturmuyordu . Şimdiye kadar Playground çalışmak için buldum tek yolu yapmaktırlabel.sizeToFit()