Краткая история заключается в том, что я хотел бы получить границы (я думаю, что я имею в виду границы вместо кадра) NSBezierPath, чтобы заполнить представление. Что-то вроде этого: Перевод представления с помощью пути (ObjectiveC, Cocoa)
Для создания вышеуказанного изображения я масштабировал/переводил каждую точку в моем созданном пути, используя информацию от Covert latitude/longitude point to a pixels (x,y) on mercator projection. Проблема в том, что это не масштабируется (я буду добавлять еще много путей), и я хочу легко добавить функции панорамирования/масштабирования для своего представления. Кроме того, я хочу, чтобы удар оставался неизменным независимо от масштаба (т. Е. Без жировых границ при увеличении).
Кажется, я хочу, чтобы создать повторно используемый путь в некоторой произвольной системе отсчета (например долготы и широты модифицированную) вместо того, чтобы генерировать новый путь каждый раз, когда изменения окна. Затем я могу перевести/масштабировать систему координат моего представления, чтобы заполнить представление с помощью пути.
Таким образом, я использовал Apple's geometry guide для изменения рамки представления. Я получил перевод правильно, но масштабирование не удалось.
[self setBoundsOrigin:self.path.bounds.origin];
[self scaleUnitSquareToSize:NSMakeSize(1.5, 1.5)];
Тогда я попробовал coordinate system transformation в моем DrawRect: метод только в конечном итоге с аналогичным результатом.
NSAffineTransform* xform = [NSAffineTransform transform];
[xform translateXBy:(-self.path.bounds.origin.x) yBy:(-self.path.bounds.origin.y)];
[xform scaleXBy:1.5 yBy:1.5];
[xform concat];
Наконец я попытался вручную настройки просмотра границ в DrawRect: но результат был некрасив и очень медленно!
Я знаю, что я могу также преобразовать объект NSBezierPath, и я думаю, что будет работать, но я предпочел бы трансформировать представление один раз вместо того, чтобы циклически и преобразования каждого пути каждое обновление. Я думаю, что есть три строки кода, которые я пропускаю, что будет делать именно то, что я ищу.
Edit: Вот DrawRect: метод я использую:
- (void)drawRect:(NSRect)dirtyRect
{
// NSAffineTransform* xform = [NSAffineTransform transform];
// [xform translateXBy:-self.path.bounds.origin.x yBy:-self.path.bounds.origin.y];
// [xform scaleXBy:1.5 yBy:1.5];
// [xform concat];
[self drawBoundaries];
NSRect bounds = [self bounds];
[[NSColor blackColor] set];
[NSBezierPath fillRect:bounds];
// Draw the path in white
[[NSColor whiteColor] set];
[self.path stroke];
[[NSColor redColor] set];
[NSBezierPath strokeRect:self.path.bounds];
NSLog(@"path origin %f x %f",self.path.bounds.origin.x, self.path.bounds.origin.y);
NSLog(@"path bounds %f x %f",self.path.bounds.size.width, self.path.bounds.size.height);
}
Не хотите ли изменить размер границ, а не происхождение? –
Границы пути имеют начало -124.87 x 25.17 и размер 58.01 x 31.79. –
Я имел в виду, если вы хотите масштабировать чертеж, вы должны изменить границы, но это также уменьшит толщину линии ... можно ли увидеть вашу реализацию 'drawRect:'? –