Я знаю, как создать NSImage
изображающая NSView
и все его подвидов, но то, что я после того, как это NSImage
из зрения, игнорируя его подвидов. Я могу придумать, как это сделать с подклассом NSView
, но я стараюсь избегать подкласса, если это возможно. У кого-нибудь есть идеи?Создание NSImage из-за NSView
ответ
Скрыть подвиды, захватить изображение, отобразите на подвиды:
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];
}
Вы должны проверить наличие скрытых объектов и не показывать их в конце. –
Спасибо, код изменен, чтобы сохранить состояние ранее скрытых подзонов. –
Это отличное предложение - так просто, и все же оно, вероятно, никогда не приходило мне в голову! –
Я бы предложил сделать копию нужного NSView вне экрана и сделать снимок.
Вы можете временно удалить подвиды, создать образ, и поставить подвиды обратно. Это было просто, но теперь с автоматическим макетом это проблема, потому что удаление subviews также устраняет любые ограничения, которые ссылаются на них. –
Я бы сделал это в приложении, предназначенном для того, чтобы помочь мне устранить другие приложения, поэтому удар по производительности, связанный с удалением и повторным добавлением ограничений, на самом деле не имеет большого значения - приоритет - это подход, который может применяться к любому представлению иерархия. Если этот метод remove-then-reinstall можно сделать надежно для любого вида, это может быть способ пойти - я посмотрю, как далеко я получу. –