Такое ощущение, что вы заново изобретаете [NSAttributedString boundingRectWithSize:options:]
(или просто size
).Я что-то упустил в вашей реализации?NSLayoutManager
предназначен для размещения быстро меняющихся строк (например, в текстовом представлении).Большую часть времени это излишне.Вы намеренно обойдете его оптимизацию (в своей строке вы заметили, что NSLayoutManager
ленивый, что вы подразумеваете под оптимизированным: D)
В любом случае, чтобы изменить поведение обертывания, вам нужно изменить NSAttributedString
сам.Обтекание является частью стиля абзаца .Примерно так (не проверено; может не скомпилироваться):
// Lazy here. I'm assuming the entire string has the same style
NSMutableParagraphStyle *style = [[self attribute:NSParagraphStyleAttributeName atIndex:0 effectiveRange:NULL] mutableCopy];
[style setLineBreakMode:NSLineBreakByCharWrapping];
NSAttributedString *charWrappedString = [self mutableCopy];
[charWrappedString setAttribute:NSParagraphStyleAttributeName value:style range:NSMakeRange(0, [self length]];
NSRect boundingRect = [self boundingRectWithSize:NSMakeSize(width, height) options:0];
NSSize size = boundRect.size;
[style release];
[charWrappedString release];
return size;
Стили немного сложнее, потому что они включают в себя несколько вещей, но вы должны установить их все вместе.Поэтому, если в атрибутивной строке были разные стили, вам нужно перебрать строку, обрабатывая каждый effectiveRange
.(Вы хотите прочитать документы, чтобы понять компромисс между attributesAtIndex:effectiveRange:
и attributesAtIndex:longestEffectiveRange:inRange:
.)