2015-05-27 7 views
0

Я пытаюсь получить расположение глифов в NSLayoutManager, но в нескольких отдельных случаях я получаю то, что кажется неправильным.locationForGlyphAtIndex возвращает неправильное значение

Например: два f вместе в Helvetica Neue size 16. Значение x второго f должно быть около 4, но я получаю 9.232000 ..? Кто-нибудь знает, почему это?

NSString *lettersString = @"ff"; 
NSDictionary *attrsDictionary = @{ 
    NSFontAttributeName: [UIFont fontWithName:@"HelveticaNeue" size:16] 
}; 

NSAttributedString *attributedString = [[NSAttributedString alloc] initWithString:lettersString attributes:attrsDictionary]; 
NSTextStorage *textStorage = [[NSTextStorage alloc] initWithAttributedString:attributedString]; 

NSLayoutManager *layoutManager = [[NSLayoutManager alloc] init]; 
[textStorage addLayoutManager:layoutManager]; 
NSTextContainer *textContainer = [[NSTextContainer alloc] initWithSize:CGSizeMake(100, 100)]; 
textContainer.lineFragmentPadding = 0; 

[layoutManager addTextContainer:textContainer]; 

CGPoint location = [layoutManager locationForGlyphAtIndex:1]; 

// location.x == 9.232000 
+1

Я думаю, что 9.232000 - это правильное значение для 16-го HelveticaNeue. Я создал ярлык с этими параметрами, а его собственный размер - 14x23. – Astoria

+0

@Astoria, если у меня есть «fff», тогда позиция третьей буквы также возвращается как 9.232000 ...? Как 2-я и 3-я буквы имеют одинаковое положение x в строке. – user2994359

ответ

0

Решенный! iOS автоматически разрешает лигатуры (одна или несколько букв, соединенных как один символ), если они явно не отключены в строковых атрибутах.

Знаки ff в этом примере преобразуются в один символ в \uniFB00, что, конечно, шире.