Как получить NSBitmapImageRep для отображения IKImageBrowserView? - PullRequest
0 голосов
/ 31 марта 2012

у меня есть двухпанельное NSSplitView , одно его подпредставление - IKImageBrowserView .мне нужно захватить его растровое изображение, чтобы заменить его перед анимацией NSSplitView с помощью CATransition .

с использованием cacheDisplayInRect не захватывает содержимое IKImageBrowserView , нодействительно захватывает содержимое другой панели.Я думаю, что это, скорее всего, связано с тем, что IKImageBrowserView имеет свое собственное дерево слоев.

Может кто-нибудь подтвердить, что это правда?

NSBitmapImageRep *imageRep = [self.imagesSplitView bitmapImageRepForCachingDisplayInRect:visibleRect];
        [self.imagesSplitView cacheDisplayInRect:visibleRect toBitmapImageRep:rep];
        NSImage *tempImage = [[NSImage alloc] initWithCGImage:[imageRep CGImage] size:visibleRect.size];
        [self.tempView setImage:tempImage];
        [self.holdingView replaceSubview:self.imagesSplitView with:self.tempView];

есть лиЛюбое предложение о том, как я могу получить растровую копию содержимого представления?

renderInContext не поможет мне, я не думаю, потому что IKImageBrowserView не раскрывает методы дляссылка на его presentationLayer - если он вообще есть.

я думаю ImageKit - это комбинация CALayers / CAOpenGLLayers и alchemy .

спасибо.

1 Ответ

0 голосов
/ 02 апреля 2012

без получения здесь подтверждения и невозможности использовать метод cacheDisplayInRect; я обнаружил, что использование API служб кварцевых окон работает.

at кажется, что для использования replaceSubView требуется задержка, поэтому я сделал это с блоком и успешно захватил растровое изображение.

вот код, который работает для меня на случай, если это поможет кому-то еще:

NSScrollView *sc = [self.browserView enclosingScrollView]; // i need the scrollView in the image
NSRect viewRect = [sc visibleRect];
NSRect transRect = [[self.window contentView] convertRect:viewRect fromView:sc];

CGWindowID windowID = (CGWindowID)[self.window windowNumber];
CGWindowListOption singleWindowOptions = kCGWindowListOptionIncludingWindow;
CGImageRef windowImage = CGWindowListCreateImage( CGRectNull, singleWindowOptions, windowID, kCGWindowImageBoundsIgnoreFraming);
CGImageRef viewImage = CGImageCreateWithImageInRect(windowImage, NSRectToCGRect(transRect));
NSBitmapImageRep *bitMapRep = [[NSBitmapImageRep alloc] initWithCGImage:viewImage];
NSImage *image = [[NSImage alloc] init];
[image addRepresentation:bitMapRep];
NSImageView *iv = [[NSImageView alloc] initWithFrame:transRect]; 
[iv setImage: image];

double delayInSeconds = 0.01;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void) {

    [[self.window contentView] replaceSubview:sc with:iv];
    });
...