Chociaż pytanie brzmi programowo, napotkałem ten sam problem i wolę pracować w programie Interface Builder, pomyślałem, że przydatne może być dodanie do istniejących odpowiedzi za pomocą rozwiązania Interface Builder.
Pierwsza rzecz to zapomnieć sizeToFit
. Auto Layout zajmie się tym w Twoim imieniu na podstawie wewnętrznego rozmiaru zawartości.
Problem polega zatem na tym, jak dopasować etykietę do zawartości za pomocą automatycznego układu? A konkretnie - bo o tym mowa w pytaniu - wysokość. Zauważ, że te same zasady odnoszą się do szerokości.
Zacznijmy więc od przykładu UILabel, który ma wysokość ustawioną na 41 pikseli:
Jak widać na powyższym zrzucie ekranu, "This is my text"
ma dopełnienie powyżej i poniżej. To jest dopełnienie między wysokością UILabel a jego zawartością, tekstem.
Jeśli uruchomimy aplikację w symulatorze, na pewno zobaczymy to samo:
Teraz wybierzmy UILabel w Interface Builder i przyjrzyjmy się domyślnym ustawieniom w Inspektorze rozmiaru:
Zwróć uwagę na zaznaczone powyżej ograniczenie. To jest priorytet przytulania treści . Jak opisuje to Erica Sadun w doskonałym iOS Auto Layout Demystified , jest to:
sposób, w jaki widok woli unikać dodatkowego wypełnienia wokół swojej podstawowej treści
Dla nas, w przypadku UILabel, podstawową treścią jest tekst.
Tutaj dochodzimy do sedna tego podstawowego scenariusza. Nadaliśmy naszej etykiecie tekstowej dwa ograniczenia. Są w konflikcie. Mówi się, że „wysokość musi być równa wysokości 41 pikseli” . Drugi mówi „przytul widok do jego zawartości, aby nie było dodatkowego wypełnienia” . W naszym przypadku przytul widok do tekstu, aby nie było dodatkowego wypełnienia.
Teraz, dzięki automatycznemu układowi, z dwoma różnymi instrukcjami, które mówią, że rób różne rzeczy, środowisko wykonawcze musi wybrać jedną lub drugą. Nie może zrobić obu. UILabel nie może mieć jednocześnie 41 pikseli wysokości i nie może mieć wypełnienia.
Sposób rozwiązania tego problemu polega na określeniu priorytetu. Jedna instrukcja musi mieć wyższy priorytet niż druga. Jeśli obie instrukcje mówią różne rzeczy i mają ten sam priorytet, wystąpi wyjątek.
Więc spróbujmy. Moje ograniczenie wysokości ma priorytet 1000 , który jest wymagany . Wysokość przytulania treści to 250 , co jest słabe . Co się stanie, jeśli zmniejszymy priorytet ograniczenia wysokości do 249 ?
Teraz możemy zobaczyć, jak zaczyna się dziać magia. Spróbujmy na karcie SIM:
Niesamowite! Osiągnięto przytulanie treści. Tylko dlatego, że priorytet wysokości 249 jest mniejszy niż priorytet obejmowania treści 250 . Zasadniczo mówię, że „wysokość, którą tu podam, jest mniej ważna niż ta, którą określiłem dla przytulania treści” . Tak więc przytulanie treści wygrywa.
Podsumowując, dopasowanie etykiety do tekstu może być tak proste, jak określenie ograniczenia wysokości - lub szerokości - i prawidłowe ustawienie tego priorytetu w powiązaniu z ograniczeniem priorytetu obejmującym treść tej osi.
Pozostawi robienie odpowiednika szerokości jako ćwiczenie dla czytelnika!
label.sizeToFit()
w Xcode / viewController, ograniczenia były wystarczające. nie tworzył etykiety w Playground . Jak dotąd jedyny sposób, w jaki znalazłem to do pracy w Playground, to robićlabel.sizeToFit()