打印时 IKImageView 图像不可见

IKImageView image not visible while printing

我有 NSSplitView 两边有两个 IKImageView 来相互比较。我正在尝试实现打印功能,但图像在预览时消失了。 (What should be printed vs What I get)

我尝试了什么:

基于docs,锁定焦点在splitView,直接用

打印

[[NSPrintOperation printOperationWithView:view] runOperation];

但只要文档声明

If UI contains multiple views that can have focus view-based printing doesn’t work well.

我尝试制作 splitView 的 "screenshot"(Method 1, Method 2),用单个 NSImageView 创建新的 viewController,然后在那里显示我的屏幕截图打印图像视图。但是即使在屏幕截图中也看不到图像。

重要的是,如果我使用 NSImageViews 而不是 IKImageViews,打印效果很好。

我还能尝试什么?(objective-cswift 解决方案都可以)

终于找到了解决方法(也考虑了缩放级别)。我从 IKImageViews 得到 NSImages,将它们传递给新的 ViewController,在那里我显示将要打印的内容的预览。在那个 viewcontroller 中,我有一个简单的 NSView(rootView),并排有两个 NSImagesViews。我将图像从 IkImageViews 设置为 NSImageViews,然后打印 rootView。

这是我从 IkImageViews 得到 NSImages 的方法:

步骤:IkImageView 获取 visible/cropped/zoomed 矩形;从 IKImageView's CGImageRef 创建 NSImage;创建新的 NSImage 并将裁剪后的图像绘制到其中。

Note: obj-c syntax might be a bit wrong, I have never written even a single line of obj-c before(Xamarin Developer).

Objective-c:

NSRect croppedRect = [imageView convertViewRectToImageRect:[imageView visibleRect]];
NSImage srcImage = [[NSImage alloc] initWithCGImage:[imageView image] size:NSZeroSize];
NSImage croppedImage = [[NSImage alloc] initWithSize:croppedRect.size];
[croppedImage lockFocus];
[srcImage drawAtPoint:NSZeroPoint
          fromRect:croppedRect
          operation:NSCompositeCopy
          fraction:1.0];
[croppedImage unlockFocus];
return croppedImage;

C#(Xamarin):

NSImage GetImageToPrint()
    {
        var cropRect = LeftImage.ConvertViewRectToImageRect(LeftImage.VisibleRect());

        NSImage srcImage = new NSImage(LeftImage.Image, LeftImage.ImageSize);
        NSImage croppedImage = new NSImage(cropRect.Size);
        croppedImage.LockFocus();
        srcImage.Draw(CGPoint.Empty, cropRect, NSCompositingOperation.Copy, 1.0f);
        croppedImage.UnlockFocus();

        return croppedImage;
    }

希望任何人都能找到有用的答案。