Кэшировать контекст NSView

Я пытаюсь сохранить текущий контекст NSView и снова нарисовать его позже в NSView. Мне было интересно, какой самый быстрый и эффективный способ сделать это?


person Abcd Efg    schedule 21.09.2012    source источник


Ответы (1)


Вы можете нарисовать свой контент в NSImage и просто перерисовать изображение позже, но при необходимости вам нужно аннулировать кеш (это зависит от того, что делает ваше представление).

Пример:

@interface SOCacheView : NSView

@end

@implementation SOCacheView
{
    NSImage *_cache;
}

- (void)drawRect:(NSRect)dirtyRect
{
    [super drawRect:dirtyRect];

    if (!_cache) [self prepareImage];

    [_cache drawAtPoint:NSZeroPoint fromRect:self.bounds operation:NSCompositeSourceOver fraction:1.0];
}

- (void)prepareImage
{
    _cache = [[NSImage alloc] initWithSize:self.bounds.size];
    [_cache lockFocus];

    // do the drawing here...

    [[NSColor blueColor] setFill];
    NSRectFill(NSMakeRect(0, 0, NSWidth(self.bounds)/2, NSHeight(self.bounds)));
    [[NSColor redColor] setFill];
    NSRectFill(NSMakeRect(NSWidth(self.bounds)/2, 0, NSWidth(self.bounds)/2, NSHeight(self.bounds)));

    [_cache unlockFocus];
}

Чтобы аннулировать кешированный рисунок, просто установите _cache на nil.

Вот пример проекта, с которым вы можете поиграть ????

person Guilherme Rambo    schedule 23.09.2015