В настоящее время я пишу много фрагментов текста в NSView, используя вспомогательный метод NSString ... однако во многих случаях очень медленно пишется большое количество повторяющегося текста. Я пытаюсь переписать код так, чтобы текст преобразовывался в NSBezierPath, которые генерируются один раз, а затем отрисовываются много раз. Ниже будет нарисован текст в нижней части экрана.
Я все еще пытаюсь прочитать документацию Apple, чтобы понять, как это работает, но в то же время мне интересно, есть ли простой способ изменить этот код, чтобы перерисовать путь в нескольких местах?
// Write a path to the view
NSBezierPath* path = [self bezierPathFromText: @"Hello world!" maxWidth: width];
[[NSColor grayColor] setFill];
[path fill];
Вот метод, который записывает некоторый текст в путь:
-(NSBezierPath*) bezierPathFromText: (NSString*) text maxWidth: (float) maxWidth {
// Create a container describing the shape of the text area,
// for testing done use the whole width of the NSView.
NSTextContainer* container = [[NSTextContainer alloc] initWithContainerSize:NSMakeSize(maxWidth - maxWidth/4, 60)];
// Create a storage object to hold an attributed version of the string to display
NSFont* font = [NSFont fontWithName:@"Helvetica" size: 26];
NSDictionary* attr = [NSDictionary dictionaryWithObjectsAndKeys: font, NSFontAttributeName, nil];
NSTextStorage* storage = [[NSTextStorage alloc] initWithString: text attributes: attr];
// Create a layout manager responsible for writing the text to the NSView
NSLayoutManager* layoutManger = [[NSLayoutManager alloc] init];
[layoutManger addTextContainer: container];
[layoutManger setTextStorage: storage];
NSRange glyphRange = [layoutManger glyphRangeForTextContainer: container];
NSGlyph glyphArray[glyphRange.length];
NSUInteger glyphCount = [layoutManger getGlyphs:glyphArray range:glyphRange];
NSBezierPath* path = [[NSBezierPath alloc] init];
//NSBezierPath *path = [NSBezierPath bezierPathWithRect:NSMakeRect(0, 0, 30, 30)];
[path moveToPoint: NSMakePoint(0, 7)];
[path appendBezierPathWithGlyphs:glyphArray count: glyphCount inFont:font];
// Deallocate unused objects
[layoutManger release];
[storage release];
[container release];
return [path autorelease];
}
Редактировать: Я пытаюсь оптимизировать приложение, которое выводит на экран последовательность больших объемов текста, например последовательность из 10 000 чисел. Каждое число имеет маркировку вокруг него и / или различное количество пробелов между ними, а некоторые числа имеют точки и / или линии выше, ниже или между ними. Это как пример в верхней части второй страницы этого документа, но с гораздо большим количеством вывода.