2015-04-20 2 views
0

Я знаю, как создать NSImage изображающая NSView и все его подвидов, но то, что я после того, как это NSImage из зрения, игнорируя его подвидов. Я могу придумать, как это сделать с подклассом NSView, но я стараюсь избегать подкласса, если это возможно. У кого-нибудь есть идеи?Создание NSImage из-за NSView

+0

Вы можете временно удалить подвиды, создать образ, и поставить подвиды обратно. Это было просто, но теперь с автоматическим макетом это проблема, потому что удаление subviews также устраняет любые ограничения, которые ссылаются на них. –

+0

Я бы сделал это в приложении, предназначенном для того, чтобы помочь мне устранить другие приложения, поэтому удар по производительности, связанный с удалением и повторным добавлением ограничений, на самом деле не имеет большого значения - приоритет - это подход, который может применяться к любому представлению иерархия. Если этот метод remove-then-reinstall можно сделать надежно для любого вида, это может быть способ пойти - я посмотрю, как далеко я получу. –

ответ

1

Скрыть подвиды, захватить изображение, отобразите на подвиды:

NSMutableArray* hiddenViews = [[NSMutableArray] alloc init]; 

for (NSView* subview in [self subviews]) { 
    if (subview hidden) [hiddenViews addObject: subview]; 
    else [subview setHidden:YES]; 
} 

NSSize imgSize = self.bounds.size; 
NSBitmapImageRep * bir = [self bitmapImageRepForCachingDisplayInRect:[self bounds]]; 
[bir setSize:imgSize]; 
[self cacheDisplayInRect:[self bounds] toBitmapImageRep:bir]; 
NSImage* image = [[NSImage alloc] initWithSize:imgSize]; 
[image addRepresentation:bir]; 

for (NSView* subview in [self subviews]) { 
    if (![hiddenViews containsObject: subview]) 
     [subview setHidden:NO]; 
} 
+0

Вы должны проверить наличие скрытых объектов и не показывать их в конце. –

+0

Спасибо, код изменен, чтобы сохранить состояние ранее скрытых подзонов. –

+0

Это отличное предложение - так просто, и все же оно, вероятно, никогда не приходило мне в голову! –

0

Я бы предложил сделать копию нужного NSView вне экрана и сделать снимок.