Nsparagraphstyle odstępy między wierszami ignorowane

Prosty test, który się nie powiódł: Utwórz nowy projekt z tylko jednym subview (UITextView) i umieść w nim:

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
    paragraphStyle.lineHeightMultiple = 50.f;
    paragraphStyle.lineSpacing = 100.f;
    paragraphStyle.minimumLineHeight = 200.f;
    paragraphStyle.maximumLineHeight = 500.f;

    UIFont *font = [UIFont fontWithName:@"AmericanTypewriter" size:24.f];

    self.textView.attributedText = [[NSAttributedString alloc] initWithString:
    @"This is a test.\n Will I pass?" attributes:
    @{NSParagraphStyleAttributeName : paragraphStyle, NSFontAttributeName : font}];
}

Odstępy między wierszami są takie same, jak gdyby atrybut nie istniał. Czy coś ma to działać pomyślnie? Dodałem Śmieszne liczby, żeby pokazać, że to się nie zmieni...

Author: borrrden, 2012-09-24

6 answers

Jest to błąd w NSHTMLWriter, która jest prywatną klasą używaną przez UITextView do konwersji tekstu atrybutowego na HTML. Wewnętrznie wyświetla ten HTML poprzez UIWebDocumentView. Czytaj więcej o wewnętrznym działaniu UITextView w moim writeup tutaj: http://www.cocoanetics.com/2012/12/uitextview-caught-with-trousers-down/

Problem wynika z łatwej do przeoczenia specjalności w stenografii CSS czcionek. Jeśli określisz rozmiar piksela skrótem czcionki, ustawi to wielkość czcionki oraz wysokość linii. Ponieważ NSHTMLWriter umieszcza czcionkę po linii-height to powoduje, że linia-height jest anulowana przez rozmiar czcionki.

Zobacz tutaj mój Radar, który zawiera pełną analizę błędu: http://www.cocoanetics.com/2012/12/radar-uitextview-ignores-minimummaximum-line-height-in-attributed-string/

Proponuję również zgłosić błąd i wspomnieć o moim radarze #12863734.

 24
Author: Cocoanetics,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-16 16:48:10

Nie wiem, czy to wystarczy do Twoich celów, ale mógłbym dostosować odstępy między wierszami, ustawiając minimalną i maksymalną wysokość linii. Ponadto, aby użyć czcionki, umieszczam ją w właściwości font widoku tekstu, zamiast przekazywać ją jako wartość NSFontAttributeName w słowniku atrybutów. (Może ta część nie jest (dobrze) udokumentowana?)

O twoich atrybutach

lineSpacing jest obliczana od dołu linii do dołu linii górnej i przestrzeń ta jest ograniczona do wartości pomiędzy minimumLineHeight i miximumLineHeight. Próbuję powiedzieć, że być może niektóre wartości w Twoich atrybutach to anulowanie lub nadpisanie Inne.

Również jeśli trzeba po prostu dostosować odstępy między wierszami, prawdopodobnie nie trzeba używać paragraphStyle.lineHeightMultiple :)

Kod

To mi pomogło:

NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
paragraphStyle.minimumLineHeight = 35.f;
paragraphStyle.maximumLineHeight = 35.f;

UIFont *font = [UIFont fontWithName:@"AmericanTypewriter" size:18.f];
NSString *string = @"This is a test.\nWill I pass?\n日本語のもじもあるEnglish\nEnglish y Español";
NSDictionary *attributtes = @{
    NSParagraphStyleAttributeName : paragraphStyle,
};
self.textView.font = font;
self.textView.attributedText = [[NSAttributedString alloc] initWithString:string
                                 attributes:attributtes];

Uwagi Dodatkowe

Wydaje się, że jest sytuacja z japońskim / chińskim i może inne postacie zmieszane z znaki alfabetu w tej samej linii. Spowoduje to, że linia będzie miała większy prowadzący , aby rozwiązać, że musisz ustawić minimalną i maksymalną wysokość linii, tak jak ja. Problem widać podczas renderowania mojego przykładu bez atrybutów.

 23
Author: nacho4d,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-06 14:32:38

Ustawienie maximumLineHeight wydaje się rozwiązać ten problem dla mnie;

CGFloat fontSize = 22.f;
titleLabel.font = [UIFont boldSystemFontOfSize:fontSize];
NSMutableParagraphStyle *paragraphStyle = [[[NSMutableParagraphStyle  alloc] init] autorelease];
paragraphStyle.maximumLineHeight = fontSize/2;
titleLabel.attributedText = [[[NSAttributedString alloc]
                              initWithString:@"This is a test.\nWill I pass?"
                              attributes: @{ NSParagraphStyleAttributeName : paragraphStyle,
                                             NSFontAttributeName : titleLabel.font}]
                             autorelease];

nakładające się linie

 8
Author: Henrik Hartz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-05 09:22:37

Dla tego konkretnego ciągu należy zamiast tego ustawić paragraphSpacing. Co jest o lineSpacing, wierzę, że to nie jest jeszcze obsługiwane na iOS.

 5
Author: mifki,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-24 09:57:28

Jak odpowiedział nacho4d, w iOS 6 musisz użyć minimumLineHeight i maximumLineHeight i ustawić czcionkę bezpośrednio w UITextView, a nie w NSAttributedString jako wysokość linii w tym przypadku zostanie nadpisana.

Należy pamiętać, że po ustawieniu czcionki w UITextView , właściwość "editable" w UITextView powinna być ustawiona na YES, w innym przypadku przypisany tekst nie będzie miał wpływu.

Te problemy występują tylko w iOS 6. W iOS 7 i ponad wszystko jest ok;

 0
Author: Hordaric,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-15 14:29:37

W moim przypadku żadna ze stylizacji akapitu nie działała. Poprawka polegała na ustawieniu przypisanego tekstu na etykiecie po wykonaniu jakichkolwiek korekt ramki na etykiecie. :)

 0
Author: Erik Villegas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-23 18:57:27