Перерисовывать NSBezierPath несколько раз с масштабированием? - PullRequest
1 голос
/ 03 июля 2011

В настоящее время я пишу много фрагментов текста в 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 чисел. Каждое число имеет маркировку вокруг него и / или различное количество пробелов между ними, а некоторые числа имеют точки и / или линии выше, ниже или между ними. Это как пример в верхней части второй страницы этого документа, но с гораздо большим количеством вывода.

Ответы [ 2 ]

1 голос
/ 03 июля 2011

Вы можете начать с удаления строки:

[path moveToPoint: NSMakePoint(0, 7)];

, чтобы ваш путь не был привязан к определенному месту в представлении.Сделав это, вы можете вызвать свой метод, чтобы получить путь, перейти к точке, обвести путь, перейти к другой точке, обвести путь и так далее.Если вы хотите перейти от начальной точки в описании пути, используйте -relativeMoveToPoint:.

0 голосов
/ 03 июля 2011

Похоже, это может помочь, но я не уверен, что это лучший способ сделать это?

// Create the path
NSBezierPath* path = [self bezierPathFromText: @"Fish are fun to watch in a fish tank, but not fun to eat, or something like that." maxWidth: width];

// Draw a copy of it at a transformed (moved) location
NSAffineTransform* transform = [[NSAffineTransform alloc] init];
[transform translateXBy: 10 yBy: 10];
NSBezierPath* path2 = [path copy];
[path2 transformUsingAffineTransform: transform];
[[NSColor greenColor] setFill];
[path2 fill];
[path2 release];
[transform release];
[path2 release];

// Draw another copy of it at a transformed (moved) location
transform = [[NSAffineTransform alloc] init];
[transform translateXBy: 10 yBy: 40];
path2 = [path copy];
[path2 transformUsingAffineTransform: transform];
[[NSColor greenColor] setFill];
[path2 fill];
[path2 release];
[transform release];
...