-1

私は 2ペインのNSSplitViewを持っています。その 1 つのサブビューはIKImageBrowserViewです。NSSplitView をCATransitionでアニメーション化する前に、そのビットマップをキャプチャして所定の位置にスワップする必要があります。

usingはIKImageBrowserViewcacheDisplayInRectのコンテンツをキャプチャしませんが、他のペインのコンテンツをうまくキャプチャします。これは、独自のレイヤーツリーを持つ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];

ビューの内容のビットマップ コピーを取得する方法について何か提案はありますか?

renderInContextIKImageBrowserViewは、そのpresentationLayerを参照するためのメソッドを明らかにしないため、私には役に立たないと思います。

ImageKitCALayers/CAOpenGLLayersalchemyの組み合わせだと思います。

ありがとう。

4

1 に答える 1

-1

ここで確認が取れず、cacheDisplayInRectメソッドを使用できません。Quartz Window Services APIを使用すると機能することがわかりました。

使用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];
    });
于 2012-04-01T21:36:43.560 に答える