Ustaw odstępy między wierszami UILabel

Odpowiedzi:

122

Edycja: Najwyraźniej NSAttributedStringzrobi to na iOS 6 i nowszych. Zamiast używać NSStringdo ustawiania tekstu etykiety, utwórz NSAttributedString, ustaw atrybuty, a następnie ustaw jako .attributedTextna etykiecie. Kod, który chcesz, będzie wyglądał mniej więcej tak:

NSMutableAttributedString* attrString = [[NSMutableAttributedString  alloc] initWithString:@"Sample text"];
NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc] init];
[style setLineSpacing:24];
[attrString addAttribute:NSParagraphStyleAttributeName
    value:style
    range:NSMakeRange(0, strLength)];
uiLabel.attributedText = attrString;

Stary attributedStringWithString NSAttributedString za zrobił to samo, ale teraz , że jest przestarzała.

Z powodów historycznych, oto moja pierwotna odpowiedź:

Krótka odpowiedź: nie możesz. Aby zmienić odstępy między wierszami tekstu, będziesz musiał podklasować UILabeli zawinąć własne drawTextInRect, utworzyć wiele etykiet lub użyć innej czcionki (być może takiej, która została edytowana dla określonej wysokości wiersza, zobacz odpowiedź Phillipe'a).

Długa odpowiedź: W świecie druku i internetu przestrzeń między wierszami tekstu jest określana jako „wiodąca” (rymuje się z „nagłówkiem” i pochodzi od ołowianego metalu używanego dziesiątki lat temu). Leading to właściwość tylko do odczytu programu UIFont, która została wycofana w wersji 4.0 i zastąpiona przez lineHeight. O ile wiem, nie ma możliwości utworzenia czcionki o określonym zestawie parametrów, takich jak lineHeight; otrzymujesz czcionki systemowe i każdą dodaną niestandardową czcionkę, ale nie możesz ich modyfikować po zainstalowaniu.

Nie ma też parametru odstępu UILabel.

Nie jestem szczególnie zadowolony z UILabeljego zachowania, więc sugeruję napisanie własnej podklasy lub skorzystanie z biblioteki innej firmy. Dzięki temu zachowanie będzie niezależne od wybranej czcionki i będzie rozwiązaniem najbardziej wielokrotnego użytku.

Chciałbym, żeby było więcej elastyczności UILabeli byłbym szczęśliwy, że się mylę!

AndrewS
źródło
1
Zrobiłem to z podklasą UILabel, zasadniczo chodzi o podzielenie tekstu etykiety na tokeny, a następnie identyfikację długości każdego tokena, utworzenie oddzielnej etykiety dla każdego tokenu i dołączanie jednej po drugiej. Otóż ​​to.
Matrix
3
Kłamstwa! ;) Możesz załatać plik czcionki, aby zmienić wysokość linii - zobacz moją odpowiedź na tej stronie.
Philippe,
Jestem przekonany, że istnieje sposób, aby to zrobić za pomocą NSAttributedString. Jeśli potrzebujesz etykiet z przypisanymi ciągami znaków w wersjach wcześniejszych niż iOS 6, sprawdź OHAttributedLabel .
Spencer Williams
Zrób to za pomocą NSAttributesString, jeśli używasz iOS> = 6. Przykład
d.ennis
To jest proste i działa dobrze.
R. Mohan
75

Począwszy od ios 6, możesz ustawić przypisany ciąg w UILabel:

NSString *labelText = @"some text"; 
NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:labelText];
NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
[paragraphStyle setLineSpacing:40];
[attributedString addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, [labelText length])];
cell.label.attributedText = attributedString ;
iosMentalist
źródło
1
dzięki! Dodałbym, że użycie AttributedStringwyłącza na przykład wyrównanie tekstu etykiety, więc musisz dodać go do stylu akapitu.
cyborg86pl
56

Możesz kontrolować odstępy między wierszami w serii ujęć:

zduplikowane pytanie

Mike S.
źródło
10
Jednak w Xcode 6.1.1 wybranie etykiety i zmiana wartości linii w przypisanym panelu spowoduje migotanie panelu i zablokowanie aplikacji. Mogłem wyjść z panelu tylko przez wymuszenie zamknięcia Xcode.
izk
4
Kciuki w górę za animację
Tieme,
1
W wersji 7.1 panel trzepocze i nie ma to żadnego wpływu na czas działania. Musiałem to zrobić w kodzie.
MiguelSlv
W tej chwili przez mój panel
przepłynął
23

Z programu Interface Builder:

wprowadź opis obrazu tutaj

Programowo:

SWift 4

Korzystanie z rozszerzenia etykiety

extension UILabel {

    func setLineSpacing(lineSpacing: CGFloat = 0.0, lineHeightMultiple: CGFloat = 0.0) {

        guard let labelText = self.text else { return }

        let paragraphStyle = NSMutableParagraphStyle()
        paragraphStyle.lineSpacing = lineSpacing
        paragraphStyle.lineHeightMultiple = lineHeightMultiple

        let attributedString:NSMutableAttributedString
        if let labelattributedText = self.attributedText {
            attributedString = NSMutableAttributedString(attributedString: labelattributedText)
        } else {
            attributedString = NSMutableAttributedString(string: labelText)
        }

        // Line spacing attribute
        attributedString.addAttribute(NSAttributedStringKey.paragraphStyle, value:paragraphStyle, range:NSMakeRange(0, attributedString.length))

        self.attributedText = attributedString
    }
}

Teraz funkcja rozszerzenia połączeń

let label = UILabel()
let stringValue = "How to\ncontrol\nthe\nline spacing\nin UILabel"

// Pass value for any one argument - lineSpacing or lineHeightMultiple
label.setLineSpacing(lineSpacing: 2.0) .  // try values 1.0 to 5.0

// or try lineHeightMultiple
//label.setLineSpacing(lineHeightMultiple = 2.0) // try values 0.5 to 2.0


Lub za pomocą instancji etykiety (po prostu skopiuj i wykonaj ten kod, aby zobaczyć wynik)

let label = UILabel()
let stringValue = "Set\nUILabel\nline\nspacing"
let attrString = NSMutableAttributedString(string: stringValue)
var style = NSMutableParagraphStyle()
style.lineSpacing = 24 // change line spacing between paragraph like 36 or 48
style.minimumLineHeight = 20 // change line spacing between each line like 30 or 40

// Line spacing attribute
attrString.addAttribute(NSAttributedStringKey.paragraphStyle, value: style, range: NSRange(location: 0, length: stringValue.characters.count))

// Character spacing attribute
attrString.addAttribute(NSAttributedStringKey.kern, value: 2, range: NSMakeRange(0, attrString.length))

label.attributedText = attrString

Szybki 3

let label = UILabel()
let stringValue = "Set\nUILabel\nline\nspacing"
let attrString = NSMutableAttributedString(string: stringValue)
var style = NSMutableParagraphStyle()
style.lineSpacing = 24 // change line spacing between paragraph like 36 or 48
style.minimumLineHeight = 20 // change line spacing between each line like 30 or 40
attrString.addAttribute(NSParagraphStyleAttributeName, value: style, range: NSRange(location: 0, length: stringValue.characters.count))
label.attributedText = attrString
Krunal
źródło
Trzeba przekazać tylko jedną linię argumentacji Spacing lub wiele Linii wysokość, nie można przejść obu argumentów w inny sposób, myślę, że żaden wynik nie nadejdzie, myślę
Arpit B Parekh
16

Moim rozwiązaniem było poprawienie samego pliku czcionki i definitywne poprawienie wysokości linii. http://mbauman.net/geek/2009/03/15/minor-truetype-font-editing-on-a-mac/

Musiałem zmodyfikować „lineGap”, „ascender”, „descender” w bloku „hhea” (jak w przykładzie na blogu).

Philippe
źródło
Super fajne! Te narzędzia czcionek OS X działały również dla mojej czcionki OTF (chociaż określa tylko TTF ...). Moja czcionka miała wysokość linii 1000 (!), Zmieniłem ją na 0 i voila. Miałem mile i mile pustej przestrzeni pod tekstem w każdym wierszu.
Jonny
2
Nie mogę uwierzyć, że to najlepsze rozwiązanie (bez obrazy!), Ale zdecydowanie najprostsze. Użyłem darmowego (Windows) oprogramowania Type Light (i pod Font | Metrics | Advanced możesz modyfikować lineGap) do edycji moich czcionek. Pozwala także na „zmianę nazw” czcionek, czego nie mogłem wymyślić za pomocą narzędzia, o którym wspomniał Philippe.
Kirk Woll
To jest fantastyczne @Philippe! Dzięki za post!!
Robbie,
Zobacz także moją odpowiedź na podobne pytanie, aby uzyskać więcej informacji: stackoverflow.com/a/19553827/201828
phatmann
@iamjustaprogrammer Znów jest online.
Matt B.
4

Znalazłem biblioteki innych firm, takie jak ta:

https://github.com/Tuszy/MTLabel

To najłatwiejsze rozwiązanie.

Derek Bredensteiner
źródło
MSLabel jest lepszy
biliony
2

Oto krótki kod do programowego ustawiania odstępów między wierszami

let label = UILabel()

let attributedText = NSMutableAttributedString(string: "Your string")
let paragraphStyle = NSMutableParagraphStyle()

//SET THIS:
paragraphStyle.lineSpacing = 4
//OR SET THIS:
paragraphStyle.lineHeightMultiple = 4

//Or set both :)

let range = NSMakeRange(0, attributedText.length)
attributedText.addAttributes([NSParagraphStyleAttributeName : paragraphStyle], range: range)
label.attributedText = attributedText
ullstrm
źródło
0

Oczywiście odpowiedź Mike'a nie zadziała, jeśli programowo przekażesz łańcuch. W takim przypadku musisz przekazać przypisany ciąg i zmienić jego styl.

NSMutableAttributedString * attrString = [[NSMutableAttributedString alloc] initWithString:@"Your \nregular \nstring"];
NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc] init];
[style setLineSpacing:4];
[attrString addAttribute:NSParagraphStyleAttributeName
                   value:style
                   range:NSMakeRange(0, attrString.length)];
_label.attributedText = attrString;
Ricardo Mutti
źródło