打印

时间:2016-08-18 08:15:59

标签: objective-c macos cocoa xamarin.mac

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

我尝试了什么:

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

打印

[[NSPrintOperation printOperationWithView:view] runOperation];

但只要文档说明

  

如果UI包含多个可以进行基于焦点视图的打印的视图,则效果不佳。

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

重要的是,如果我使用NSImageViews代替IKImageViews,打印效果会很好。

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

1 个答案:

答案 0 :(得分:0)

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

以下是我从NSImages获取IkImageViews的方法:

<强>步骤:IkImageView获取可见/裁剪/缩放的矩形;从NSImage IKImageView's创建CGImageRef;创建新的NSImage并将裁剪后的图像绘制到其中。

  

注意: obj-c语法可能有点不对,我以前从未写过一行obj-c(Xamarin Developer)。

<强>目标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;
    }

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