我有一个NSImageView,它占据了整个窗口的范围。 ImageView 没有边框,其设置显示在左下方。因此,这意味着无论窗口如何调整大小, View 的原点都与实际图像的原点相匹配。
而且,图像要比我在屏幕上全尺寸显示的合理尺寸大得多。因此,我还将imageview设置为按比例缩小图像的大小。但是,我似乎在任何地方都找不到此比例因子。
我的最终目标是将鼠标按下事件映射到实际的图像坐标中。为此,我认为我还需要更多信息...显示的NSImage实际上有多大。
如果查看[imageView bounds]
,则会得到 ImageView 的边界矩形,该矩形通常大于图像。
最佳答案
我认为这可以满足您的需求:
NSRect imageRect = [imageView.cell drawingRectForBounds: imageView.bounds];
它返回 View 中图像原点的偏移量及其大小。
为了实现重新映射鼠标坐标的最终目的,自定义 View 类上的类似内容应该可以工作...
- (void)mouseUp:(NSEvent *)event
{
NSPoint eventLocation = [event locationInWindow];
NSPoint location = [self convertPoint: eventLocation fromView: nil];
NSRect drawingRect = [self.cell drawingRectForBounds:self.bounds];
location.x -= drawingRect.origin.x;
location.y -= drawingRect.origin.y;
NSSize frameSize = drawingRect.size;
float frameAspect = frameSize.width/frameSize.height;
NSSize imageSize = self.image.size;
float imageAspect = imageSize.width/imageSize.height;
float scaleFactor = 1.0f;
if(imageAspect > frameAspect) {
///in this case image.width == frame.width
scaleFactor = imageSize.width / frameSize.width;
float imageHeightinFrame = imageSize.height / scaleFactor;
float imageOffsetInFrame = (frameSize.height - imageHeightinFrame)/2;
location.y -= imageOffsetInFrame;
} else {
///in this case image.height == frame.height
scaleFactor = imageSize.height / frameSize.height;
float imageWidthinFrame = imageSize.width / scaleFactor;
float imageOffsetInFrame = (frameSize.width - imageWidthinFrame)/2;
location.x -= imageOffsetInFrame;
}
location.x *= scaleFactor;
location.y *= scaleFactor;
//do something with you newly calculated mouse location
}
关于cocoa - 在NSImageView中获取NSImage的边界,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11711913/