打印时 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-c
和 swift
解决方案都可以)
终于找到了解决方法(也考虑了缩放级别)。我从 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;
}
希望任何人都能找到有用的答案。
我有 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-c
和 swift
解决方案都可以)
终于找到了解决方法(也考虑了缩放级别)。我从 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;
}
希望任何人都能找到有用的答案。