Mam następujący kod ...
UILabel *buttonLabel = [[UILabel alloc] initWithFrame:targetButton.bounds];
buttonLabel.text = @"Long text string";
[targetButton addSubview:buttonLabel];
[targetButton bringSubviewToFront:buttonLabel];
... chodzi o to, że mogę mieć wieloliniowy tekst dla przycisku, ale tekst jest zawsze zasłonięty przez tło UIButton. Wywołanie rejestrowania w celu wyświetlenia widoków podrzędnych przycisku pokazuje, że dodano UILabel, ale sam tekst nie jest widoczny. Czy to błąd w UIButton, czy robię coś źle?
ios
cocoa-touch
uibutton
uikit
Owain Hunt
źródło
źródło
button.titleLabel?.numberOfLines = 0
Odpowiedzi:
W systemie iOS 6 i nowszym użyj następujących poleceń, aby zezwolić na wiele linii:
W przypadku iOS 5 i niższych użyj następujących opcji, aby zezwolić na wiele linii:
2017, dla iOS9 do przodu ,
ogólnie, po prostu wykonaj te dwie rzeczy:
źródło
button.titleLabel?.lineBreakMode = NSLineBreakMode.ByWordWrapping
NSLineBreakMode
, tak:button.titleLabel?.lineBreakMode = .ByWordWrapping
.Wybrana odpowiedź jest poprawna, ale jeśli wolisz zrobić coś takiego w Konstruktorze interfejsów, możesz to zrobić:
źródło
titleLabel.textAlignment
przyNumber
wartości do1
wUser Defined Runtime Attributed
aby tekst wyśrodkowanyJeśli chcesz dodać przycisk z tytułem wyśrodkowanym wieloma liniami, ustaw dla tego interfejsu Konstruktora interfejsów:
[ ]
źródło
Dla IOS 6:
Tak jak
są przestarzałe w IOS 6 i późniejszych.
źródło
NSText.h
wFoundation
tam nie jest przestarzała dodał. Jest dostępny od wersji 6.0, ale nie jest przestarzały.button.titleLabel?.lineBreakMode = NSLineBreakMode.ByWordWrapping
button.titleLabel?.textAlignment = NSTextAlignment.Center
Aby powtórzyć sugestię Rogera Nolana, ale z wyraźnym kodem, jest to ogólne rozwiązanie:
źródło
SWIFT 3
źródło
W Xcode 9.3 możesz to zrobić za pomocą scenorysów takich jak poniżej,
Musisz ustawić tekst tytułu przycisku Wyrównanie do środka
button.titleLabel?.textAlignment = .center
Nie musisz ustawiać tekstu tytułu w nowej linii (\ n) jak poniżej,
button.setTitle("Good\nAnswer",for: .normal)
Po prostu ustaw tytuł,
button.setTitle("Good Answer",for: .normal)
Oto wynik
źródło
myButton.titleLabel.textAlignment = NSTextAlignmentCenter
instrukcja jest również potrzebna.Jest o wiele łatwiejszy sposób:
(Edycja dla iOS 3 i nowszych :)
źródło
Wyrównaj do lewej w iOS7 z automatycznym układem:
źródło
Miałem problem z automatycznym układem, po włączeniu wielu linii wynik był następujący: więc rozmiar nie wpływa na rozmiar przycisku , który dodałem na podstawie (w tym przypadku contentEdgeInsets to (10, 10, 10, 10 ) po zadzwonieniu : mam nadzieję, że ci to pomoże (szybkie 5.0):
titleLabel
Constraints
contentEdgeInsets
makeMultiLineSupport()
źródło
Przede wszystkim należy pamiętać, że UIButton ma już w sobie UILabel. Możesz to ustawić za pomocą
–setTitle:forState:
.Problem z twoim przykładem polega na tym, że musisz ustawić
numberOfLines
właściwość UILabel na wartość inną niż domyślna wartość 1. Powinieneś także przejrzećlineBreakMode
właściwość.źródło
Dla tych, którzy używają scenorysu Xcode 4, możesz kliknąć przycisk, a po prawej stronie okienka Narzędzia w Inspektorze atrybutów zobaczysz opcję podziału linii. Wybierz zawijanie wyrazów i powinieneś zacząć.
źródło
Odpowiedzi tutaj mówią, jak programowo osiągnąć tytuł przycisku wielowierszowego.
Chciałem tylko dodać, że jeśli używasz scenariuszy, możesz wpisać [Ctrl + Enter], aby wymusić nowy wiersz w polu tytułu przycisku.
HTH
źródło
Musisz dodać ten kod:
źródło
Jeśli chodzi o pomysł Brenta, by umieścić tytuł UILabel jako widok rodzeństwa, nie wydaje mi się to bardzo dobrym pomysłem. Ciągle myślę w problemach z interakcją z UILabel, ponieważ zdarzenia dotykowe nie przechodzą przez widok UIButton.
Z drugiej strony, mając UILabel jako pod-widok przycisku UIBabton, czuję się całkiem komfortowo, wiedząc, że zdarzenia dotykowe zawsze będą propagowane do superwizji UILabel.
Przyjąłem to podejście i nie zauważyłem żadnego problemu zgłoszonego z backgroundImage. Dodałem ten kod do -titleRectForContentRect: podklasy UIButton, ale kod można również umieścić w procedurze rysowania superview UIButton, która w takim przypadku zastąpi wszystkie odniesienia do siebie zmienną UIButton.
Zrobiłem trochę czasu i napisałem trochę więcej na ten temat tutaj . Tam też wskazuję krótsze rozwiązanie, choć nie do końca pasuje do wszystkich scenariuszy i obejmuje hakowanie prywatnych widoków. Tam również możesz pobrać podklasę UIButton gotową do użycia.
źródło
Jeśli korzystasz z automatycznego układu na iOS 6, może być konieczne ustawienie
preferredMaxLayoutWidth
właściwości:źródło
Ustawienie lineBreakMode na NSLineBreakByWordWrapping (w IB lub w kodzie) powoduje, że etykieta przycisku jest wielowierszowa, ale nie wpływa na ramkę przycisku.
Jeśli przycisk ma dynamiczny tytuł, istnieje jedna sztuczka: umieść ukryty UILabel tą samą czcionką i powiązaj jego wysokość z wysokością przycisku za pomocą układu; po ustawieniu tekstu na przycisk i etykieta oraz autolayout wszystko zadziała.
Uwaga
Wewnętrzna wielkość przycisku o jednym wierszu jest większa niż wartość etykiety, więc aby zapobiec zmniejszeniu się wysokości etykiety, jego pionowy priorytet Przytulanie zawartości musi być większy niż pionowy przycisk Odporność na kompresję treści.
źródło
W Swift 5.0 i Xcode 10.2
W swoim ViewController zadzwoń w ten sposób
źródło
Działa idealnie.
Dodaj, aby użyć tego z plikiem konfiguracyjnym, takim jak Plist, musisz użyć CDATA, aby napisać tytuł wielowarstwowy, jak poniżej:
źródło
Jeśli korzystasz z automatycznego układu.
źródło
szybki 4.0
źródło
W dzisiejszych czasach, jeśli naprawdę potrzebujesz tego rodzaju rzeczy, aby być dostępnym w kreatorze interfejsów dla poszczególnych przypadków, możesz to zrobić za pomocą prostego rozszerzenia takiego jak ten:
Następnie możesz po prostu ustawić numberOfLines jako atrybut w dowolnej podklasie UIButton lub UIButton, tak jakby to była etykieta. To samo dotyczy całego szeregu innych zwykle niedostępnych wartości, takich jak promień narożny warstwy widoku lub atrybuty rzucanego przez niego cienia.
źródło
Swift 5, dla tekstu wielowierszowego w UIButton
źródło
Rzuć własną klasą przycisków. To zdecydowanie najlepsze rozwiązanie na dłuższą metę. UIButton i inne klasy UIKit są bardzo restrykcyjne w sposobie ich dostosowywania.
źródło
źródło
I włączone odpowiedź jessecurry w zasięgu STAButton który jest częścią mojego STAControls bibliotecznych open source. Obecnie używam go w jednej z rozwijanych przeze mnie aplikacji i działa na moje potrzeby. Nie krępuj się otwierać problemów dotyczących tego, jak to poprawić lub wysyłać mi prośby o pobranie.
źródło
Aby naprawić odstępy między etykietami tytułu dla przycisku, ustaw titleEdgeInsets i inne właściwości przed setTitle:
PS Przetestowałem ustawienie titleLabel? .Text Wyrównanie nie jest konieczne, a tytuł wyrównuje się
.natural
.źródło
Chociaż dodawanie widoku podrzędnego do formantu jest w porządku, nie ma gwarancji, że faktycznie zadziała, ponieważ formant może nie oczekiwać, że tam będzie, a zatem może źle się zachowywać. Jeśli możesz to zrobić, po prostu dodaj etykietę jako widok rodzeństwa przycisku i ustaw ramkę tak, aby zachodziła na przycisk; dopóki ustawiony jest na górze przycisku, nic, co może zrobić przycisk, nie zasłoni go.
Innymi słowy:
źródło
addSubview:
tutaj dodaje go dobutton
podglądu, dzięki czemu jest rodzeństwem przycisku, więc dopasowanie ich centrów jest prawidłowe.