我有一个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/

10-10 19:03