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...
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.
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.
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];
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.
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;
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. :)
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