Próbuję utworzyć UIButton
etykietę, która ma dwa wiersze tekstu w tytule. Oto kod, którego używam:
UIButton *titleButton = [[UIButton alloc] initWithFrame:CGRectMake(15, 10, frame.size.width-100, 100)];
titleButton.titleLabel.font = [UIFont boldSystemFontOfSize:24.0];
[titleButton setTitle:@"This text is very long and should get truncated at the end of the second line" forState:UIControlStateNormal];
titleButton.titleLabel.lineBreakMode = UILineBreakModeTailTruncation;
titleButton.titleLabel.numberOfLines = 2;
[self addSubview:titleButton];
Kiedy próbuję tego, tekst pojawia się tylko w jednej linii. Wydaje się, że jedynym sposobem na osiągnięcie więcej niż jednej linii tekstu UIButton.titleLabel
jest ustawienie numberOfLines=0
i użycie UILineBreakModeWordWrap
. Ale to nie gwarantuje, że tekst będzie miał dokładnie dwa wiersze.
UILabel
Jednak użycie zwykłego działa:
UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(15, 10, frame.size.width-100, 100)];
titleLabel.font = [UIFont boldSystemFontOfSize:24.0];
titleLabel.text = @"This text is very long and should get truncated at the end of the second line";
titleLabel.numberOfLines = 2;
titleLabel.lineBreakMode = UILineBreakModeTailTruncation;
[self addSubview:titleLabel];
Czy ktoś wie, jak wykonać UIButton
pracę z dwiema liniami? Czy jedynym rozwiązaniem jest utworzenie oddzielnego UILabel
do przechowywania tekstu i dodanie go jako podwidoku przycisku?
objective-c
ios
uibutton
uilabel
marketingowiec
źródło
źródło
numberOfLines=0
i użyjeszUILineBreakModeWordWrap
, możesz uzyskać wiele linii. Problem polega na tym, że może dać więcej niż dwa wiersze, jeśli tekst jest zbyt długi. Chcę dokładnie dwóch samotnych z elipsami na końcu drugiej linii (jeśli tekst jest za długi).Odpowiedzi:
Zaktualizowana odpowiedź na nowsze wersje iOS
Ponieważ jest to zaakceptowana odpowiedź, dodałem odpowiedź @ Sean tutaj:
Ustaw te właściwości w titleLabel swojego przycisku.
button.titleLabel.lineBreakMode = NSLineBreakByWordWrapping; button.titleLabel.numberOfLines = 2; // if you want unlimited number of lines put 0
Swift 3 i 4:
button.titleLabel?.lineBreakMode = .byWordWrapping button.titleLabel?.numberOfLines = 2 // if you want unlimited number of lines put 0
Oryginalna odpowiedź na starszą wersję iOS
Jeśli chcesz, aby na wierzchu znajdowały się 2 wiersze tekstu
UIButton
, dodajUIlabel
na nim znak , który dokładnie to robi.UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(15, 10, frame.size.width-100, 100)]; titleLabel.font = [UIFont boldSystemFontOfSize:24.0]; titleLabel.text = @"This text is very long and should get truncated at the end of the second line"; titleLabel.numberOfLines = 2; titleLabel.lineBreakMode = UILineBreakModeTailTruncation; [myButton addSubview:titleLabel]; //add label to button instead.
Zaktualizowano dla rozwiązania do tworzenia interfejsów
Dodano odpowiedź @Borut Tomazin, aby uzyskać pełniejszą odpowiedź. Zaktualizowałem tę część ponownie, ponieważ poprawiono odpowiedź @Borut Tomazin.
Możesz to zrobić znacznie łatwiej, bez konieczności stosowania kodu. W programie Interface Builder ustawiono
Line Break
UIButton naWord Wrap
. Następnie możesz wstawić wiele wierszy tytułu. Po prostu naciśnijOption + Return
klawisze, aby utworzyć nową linię. Będziesz także musiał dodać to do atrybutu środowiska wykonawczego zdefiniowanego przez użytkownika w programie Interface Builder:titleLabel.textAlignment Number [1]
źródło
UILineBreakMode
są przestarzałe, użyjNSLineBreakMode
zamiast nichNie musisz dodawać UILabel do UIButton. To tylko dodatkowe przedmioty i praca.
Ustaw te właściwości w titleLabel swojego przycisku.
button.titleLabel.lineBreakMode = NSLineBreakByWordWrapping; button.titleLabel.numberOfLines = 2;//if you want unlimited number of lines put 0
Szybki:
button.titleLabel!.lineBreakMode = NSLineBreakMode.ByWordWrapping button.titleLabel!.numberOfLines = 2//if you want unlimited number of lines put 0
źródło
intrinsicContentSize
, który nadal zwraca wysokość odpowiadającą tylko jednej linii tekstu. Naprawiłem to, zastępując przycisk, wintrinsicContentSize
którym ustawiam wysokość[self.titleLabel sizeThatFits(CGSizeMake(self.titleLabel.frame.size.width, CGFLOAT_MAX)].height
.Możesz to zrobić znacznie łatwiej, bez konieczności stosowania kodu. W programie Interface Builder ustawiono
Line Break
UIButton naWord Wrap
. Następnie możesz wstawić wiele wierszy tytułu. Po prostu naciśnijOption + Return
klawisze, aby utworzyć nową linię. Musisz również dodać to do atrybutu środowiska wykonawczego zdefiniowanego przez użytkownika w programie Interface Builder:titleLabel.textAlignment Number [1]
To takie proste. Mam nadzieję, że to pomoże...
źródło
titleLabel.textAlignment
atrybut czasu wykonywania zdefiniowany przez użytkownika w programie Interface Builder i ustawiając go na Number = 1 (wartość NSTextAlignmentCenter).button.titleLabel.lineBreakMode = NSLineBreakByWordWrapping; button.titleLabel.textAlignment = NSTextAlignmentCenter; [button setTitle: @"Line1\nLine2" forState: UIControlStateNormal];
źródło
NSString
wnętrzasetTitle
. `` WordWrapping '' robi to za Ciebie!Aby całkowicie uniknąć konieczności edycji kodu, a tym samym konieczności podklasowania widoku, w Xcode5 i nowszych możesz skorzystać z sugestii Boruta Tomazina:
a następnie w atrybutach środowiska wykonawczego zdefiniowanych przez użytkownika, które możesz dodać
Kluczowa ścieżka:
titleLabel.textAlignment
Typ:
Number
Wartość:
1
Uwaga: może to nie być całkowicie „przyszłościowe”, ponieważ przekładamy
UITextAlignmentCenter
stałą na jej wartość liczbową (i ta stała może ulec zmianie w miarę wydawania nowych wersji iOS), ale wydaje się być bezpieczna w najbliższej przyszłości.źródło
Możesz modyfikować potrzebną wartość bezpośrednio z Storyboard. Wybierz przycisk, przejdź do inspektora tożsamości i dodaj następującą parę klucz-wartość w sekcji „Atrybuty środowiska wykonawczego zdefiniowane przez użytkownika”:
źródło