W kreatorze interfejsów przytrzymanie Command+ =zmieni rozmiar przycisku, aby dopasować go do tekstu. Zastanawiałem się, czy można to zrobić programowo, zanim przycisk został dodany do widoku.
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
[button.titleLabel setFont:[UIFont fontWithName:@"Arial-BoldMT" size:12]];
[button addTarget:self action:@selector(buttonTapped:) forControlEvents:UIControlEventTouchUpInside];
// I need to know the width needed to accomodate NSStringVariable
[button setTitle:NSStringVariable forState:UIControlStateNormal];
// So that I can set the width property of the button before addSubview
[button setFrame:CGRectMake(10, 0, width, fixedHeight)];
[subNavigation addSubview:button];
Odpowiedzi:
W Xcode 4.5 i nowszych można to teraz zrobić za pomocą opcji „ Automatyczne układanie / ograniczenia ”.
Główne zalety to:
Kilka wad:
Najfajniejsze jest to, że możemy skupić się na zadeklarowaniu zamiaru, takiego jak:
Oto prosty samouczek wprowadzający do automatycznego układania.
Po więcej szczegółów .
Na początku zajmuje to trochę czasu, ale z pewnością wygląda na to, że będzie to warte wysiłku.
źródło
W UIKit istnieją dodatki do klasy NSString, aby uzyskać z danego obiektu NSString rozmiar, jaki zajmie przy renderowaniu w określonej czcionce.
Docs tutaj . Teraz jest tutaj obszarze Wycofane.
Krótko mówiąc, jeśli pójdziesz:
... ustawisz ramkę przycisku na wysokość i szerokość renderowanego ciągu.
Prawdopodobnie będziesz chciał poeksperymentować z przestrzenią buforową wokół tego CGSize, ale zaczniesz we właściwym miejscu.
źródło
Sposób na to w kodzie to:
Jeśli tworzysz podklasy i chcesz dodać dodatkowe reguły, możesz zmienić:
źródło
-(CGSize)sizeThatFits:(CGSize)size
.[button setTitle:@"Your text here" forState:UIControlStateNormal];
[button sizeToFit];
Również jeśli później zaktualizujesz tekst, nie zapomnij wywołać tego ponownie.sizeToFit()
nie przestrzega wstawek krawędzi tytułów.Jeśli twój przycisk został utworzony za pomocą Interface Builder i zmieniasz tytuł w kodzie, możesz to zrobić:
źródło
Szybki:
Ważną rzeczą jest to, kiedy zadzwonisz do programu
.sizeToFit()
, powinno to nastąpić po ustawieniu wyświetlania tekstu, aby mógł odczytać wymagany rozmiar, jeśli później zaktualizujesz tekst, wywołaj go ponownie.źródło
Aby to osiągnąć za pomocą automatycznego układu, spróbuj ustawić zmienne ograniczenie szerokości:
Konieczne może być również dostosowanie
Content Hugging Priority
iContent Compression Resistance Priority
uzyskanie potrzebnych wyników.UILabel zmienia rozmiar automatycznie :
Ten UILabel jest po prostu ustawiony na wyśrodkowanie ekranu (tylko dwa ograniczenia, poziome / pionowe):
Zmienia szerokości całkowicie automatycznie:
Nie musisz ustawiać żadnej szerokości ani wysokości - jest to całkowicie automatyczne.
Zwróć uwagę, że małe żółte kwadraty są po prostu dołączone („odstępy” równe zero). Przenoszą się automatycznie wraz ze zmianą rozmiaru UILabel.
Dodanie ograniczenia "> =" ustawia minimalną szerokość dla UILabel:
źródło
Jeśli chcesz zmienić rozmiar tekstu, a nie przycisku, możesz użyć ...
źródło
sizeToFit nie działa poprawnie. zamiast:
możesz również dodać
contentInset
do przycisku:myButton.contentEdgeInsets = UIEdgeInsetsMake(8, 8, 4, 8)
źródło
Po prostu:
UIView
jako opakowanie z automatycznym układem widoków dookoła.UILabel
do tego opakowania. Dodaj wiązania, które przykleją etykietę do krawędzi opakowania.UIButton
w swoim opakowaniu, a następnie po prostu dodaj te same ograniczenia, co w przypadkuUILabel
.źródło
Swift 4.2
Dzięki Bogu, to rozwiązane. Po ustawieniu tekstu na przycisku możesz pobrać intrinsicContentSize, który jest naturalnym rozmiarem z UIView (oficjalny dokument jest tutaj ). W przypadku UIButton możesz go używać jak poniżej.
Dla Twojej informacji dostosowałem szerokość, aby wyglądała prawidłowo.
Symulator
UIButtons z intrinsicContentSize
Źródło: https://riptutorial.com/ios/example/16418/get-uibutton-s-size-strictly-based-on-its-text-and-font
źródło
Mam dodatkowe potrzeby związane z tym postem, które
sizeToFit
nie rozwiązują. Musiałem utrzymać przycisk wyśrodkowany w jego pierwotnej lokalizacji, niezależnie od tekstu. Nie chcę też, aby przycisk był większy niż jego oryginalny rozmiar.Tak więc układam przycisk pod kątem jego maksymalnego rozmiaru, zapisuję ten rozmiar w kontrolerze i używam następującej metody, aby zmienić rozmiar przycisku po zmianie tekstu:
źródło
Ta klasa przycisku z automatycznym dostosowywaniem wysokości dla tekstu (dla platformy Xamarin, ale można ją przepisać dla innego języka)
źródło
Z jakiegoś powodu
func sizeToFit()
u mnie nie działa. Moja konfiguracja polega na używaniu przycisku wewnątrz aUITableViewCell
i używam układu automatycznego.Dla mnie zadziałało:
intrinsicContentSize
szerokość, ponieważ zgodnie z tym automatycznym układem dokumentu nie ma informacji ointrinsicContentSize
. Ustaw ograniczenieintrinsicContentSize
szerokości na szerokośćOto dwa tytuły z
Debug View Hierachry
źródło
Szczerze mówiąc, myślę, że to naprawdę wstyd, że w scenorysie nie ma prostego pola wyboru, aby powiedzieć, że chcesz zmienić rozmiar przycisków, aby pomieścić tekst. Cóż ... nieważne.
Oto najprostsze rozwiązanie wykorzystujące scenorys.
Umieść UILabel w UIView. Ustaw wiązania, aby dołączyć go do krawędzi UIView.
Umieść swój UIButton w UIView. Ustaw te same ograniczenia, aby dołączyć go do krawędzi UIView.
Ustaw 0 dla liczby wierszy UILabel.
Skonfiguruj punkty sprzedaży.
źródło