Я думаю, что решил быстрее, так как я априори не знаю, какие пути присутствуют в прямоугольнике, и я хочу избежать цикла по всем путям. К счастью, мои пути меняются не часто, поэтому я могу кэшировать все пути в NSImage. На событие mouseMoved я установил:
RefreshAfterMouseMoved = YES;
и в функции drawRect я помещаю что-то вроде:
if (RefreshAfterMouseMoved) {
[cacheImage drawAtPoint:zero fromRect:viewRect operation:1
fraction:(CGFloat)1.0];
//redraw only the hilighted path
}
else{
if (cacheImage) [cacheImage release];
cacheImage = [[NSImage alloc] initWithSize: [self bounds].size ];
[cacheImage lockFocus];
// draw everything here
[cacheImage unlockFocus];
[cacheImage drawAtPoint:zero fromRect:viewRect operation:1
fraction:(CGFloat)1.0];
}
Этот метод можно комбинировать с вышеуказанным методом setNeedsDisplayInRect, добавляя функцию mousedMoved:
NSRect a, b, ab;
a = [oldpath bounds];
b = [newpath bounds];
ab = NSUnionRect(a,b);
RefreshAfterMouseMoved = YES;
[self setNeedsDisplayInRect:ab];