gpt4 book ai didi

cocoa - 从缩放 View 拖动时 NSView 图像损坏

转载 作者:行者123 更新时间:2023-12-03 16:42:29 26 4
gpt4 key购买 nike

我有一个 NSView 的自定义子类,它实现拖/放以将 View 中的图像复制到另一个应用程序。我的类中的相关代码如下所示:

#pragma mark -
#pragma mark Dragging Support
- (NSImage *)imageWithSubviews
{
NSSize imgSize = self.bounds.size;
NSBitmapImageRep *bir = [[NSBitmapImageRep alloc] initWithFocusedViewRect:[self frame]];
[self cacheDisplayInRect:[self frame] toBitmapImageRep:bir];

NSImage* image = [[NSImage alloc]initWithSize:imgSize];
[image addRepresentation:bir];

return image;
}

- (void)mouseDown:(NSEvent *)theEvent
{
NSSize dragOffset = NSMakeSize(0.0, 0.0); // not used in the method below, but required.
NSPasteboard *pboard;
NSImage *image = [self imageWithSubviews];
pboard = [NSPasteboard pasteboardWithName:NSDragPboard];
[pboard declareTypes:[NSArray arrayWithObject:NSTIFFPboardType]
owner:self];

[pboard setData:[image TIFFRepresentation]
forType:NSTIFFPboardType];

[self dragImage:image
at:self.bounds.origin
offset:dragOffset
event:theEvent
pasteboard:pboard
source:self
slideBack:YES];

return;
}

#pragma mark -
#pragma mark NSDraggingSource Protocol

- (NSDragOperation)draggingSession:(NSDraggingSession *)session sourceOperationMaskForDraggingContext:(NSDraggingContext)context
{
return NSDragOperationCopy;
}

- (BOOL)ignoreModifierKeysForDraggingSession:(NSDraggingSession *)session
{
return YES;
}

这将按预期工作,直到我调整主窗口的大小。主窗口仅以相同的增量增加尺寸/宽度,以保持此 View 中的正确比例。调整窗口大小时, View 会在屏幕上正确显示其内容。

当我调整窗口大小超过 + 25% 时,就会出现问题。虽然它仍然按预期显示,但从其中拖出的图像(例如拖入页面)已损坏。该图像的一部分似乎在其自身之上重复出现。

正常情况下是这样的:

normal appearance

以下是在调整主窗口大小以使其变大后拖动到 Pages 时的样子(缩小以在此处显示 - 想象它是第一个图像大小的 2-3 倍): corrupt appearance

请注意,我用虚线矩形突出显示了损坏区域。

还有一些注意事项:我将边界设置为 NSMakeRect(-200,-200,400,400) 因为它使对称绘图更容易一些。当窗口调整大小时,我重新计算边界以将 0,0 保持在 NSView 的中心。 NSView 始终是正方形的。

最后,Apple 文档对 cacheDisplayInRect:toBitmapImageRep: 中的 bitmapImageRep 参数进行了以下说明:

An NSBitmapImageRep object. For pixel-format compatibility, bitmapImageRep should have been obtained from bitmapImageRepForCachingDisplayInRect:.

我尝试使用bitmapImageRepForCachingDisplayInRect:,但我看到的只是图像右上象限中金字塔的左下象限。这让我觉得我需要为 bitmapImageRep 的捕获添加一个偏移量,但我一直无法确定如何做到这一点。

这是我尝试时 imageWithSubviews 的代码:

- (NSImage *)imageWithSubviews
{
NSSize imgSize = self.bounds.size;
NSBitmapImageRep *bir = [self bitmapImageRepForCachingDisplayInRect:[self bounds]];
[self cacheDisplayInRect:[self bounds] toBitmapImageRep:bir];

NSImage* image = [[NSImage alloc]initWithSize:imgSize];
[image addRepresentation:bir];

return image;
}

这就是生成的图像的显示方式:

only lower left quadrant shows in upper right

这是在右上角绘制的左下象限的 View 。

放大窗口后从 NSView 拖动时,导致损坏的原因是什么?如何解决这个问题和/或更改上面列出的方法的实现以避免出现问题?

<小时/>

更多信息:

当我将 imageWithSubviews 方法更改为:

- (NSImage *)imageWithSubviews
{

NSSize imgSize = self.bounds.size;
NSBitmapImageRep *bir = [[NSBitmapImageRep alloc] initWithFocusedViewRect:[self frame]];
[self cacheDisplayInRect:[self bounds] toBitmapImageRep:bir];

NSImage* image = [[NSImage alloc]initWithSize:imgSize];
[image addRepresentation:bir];

return image;
}

我得到了一个未经缩放的损坏图像,其中图像的左下象限再次绘制在右上角象限的顶部,如下所示:

quadrant overwritten

我到底做错了什么?

<小时/>

解决方案:

虽然它没有解决使用 NSBitmapImageRep 绘图的核心问题,但以下 -imageWithSubviews 可以防止损坏并输出正确的图像:

- (NSImage *)imageWithSubviews
{
NSData *pdfData = [self dataWithPDFInsideRect:[self bounds]];
NSImage* image = [[NSImage alloc] initWithData:pdfData];

return image;
}

最佳答案

根据上面的一些调试,我们确定问题出在 -imageWithSubviews 中。

不再使用 -cacheDisplayInRect:toBitmapImageRep: 为 View 生成图像数据,而是将其更改为 -dataWithPDFInRect: 解决了该问题。

关于cocoa - 从缩放 View 拖动时 NSView 图像损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13769849/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com