1

我有一个包含动态生成的 NSImage 的 NSImageView。当我更改显示的图像时,我想动态调整 NSImageView 的大小,以便它精确地包裹新图像,并调整封闭窗口的大小,以便 NSImageView 和窗口的每个其他部分之间的空间保持不变。(请注意,图像视图的缩放设置为无,因为我希望它的图像始终以其物理尺寸显示。)为了说明,假设我从图像视图中的一个小图像开始。如果我用大图像替换它,我希望 NSImageView 和封闭窗口都调整大小以适应它,而不影响任何其他元素的大小或间距。

目前,每当通过步进器或关联的文本字段更改放大级别时,我都会调用以下方法。虽然重新生成图像并将其加载到 NSImageView 工作正常,但调整 NSImageView 和封闭窗口的大小却不行。

- (void) updateMagnification:(NSUInteger)newMagnification {
    // Keep values of stepper and associated text field synchronized.
    [self.magnificationStepper setIntegerValue:newMagnification];
    [self.magnificationTextField setIntegerValue:newMagnification];

    // Regenerate image based on newMagnification and display in image view.
    [self.qrGenerator generateWithBlockPixelWidth:newMagnification];
    self.imageView.image = self.qrGenerator.image;

    // Adjust frame size of image view.
    NSLog(@"Old size: frame=%@ image=%@", NSStringFromSize(self.imageView.frame.size), NSStringFromSize(self.imageView.image.size));
    [self.imageView setFrameSize:NSMakeSize(self.imageView.image.size.width, self.imageView.image.size.height   )];
    NSLog(@"New size: frame=%@ image=%@", NSStringFromSize(self.imageView.frame.size), NSStringFromSize(self.imageView.frame.size));

    //[self.window setViewsNeedDisplay:YES];
    //[self.imageView setNeedsDisplay:YES];
    //[self.imageView.superview setNeedsDisplay:YES];
}

无论我是增加还是减少放大率值,导致图像变小或变大,NSImageView 和窗口的大小都保持不变。被注释掉的三个setNeedsDisplay:调用即使没有注释也没有效果——我试图确定问题是否与控件在调整大小后不重绘有关,但调用没有效果。奇怪的是,我的NSLog调用表明 imageView 的框架确实采用了请求的大小,因为它们产生了以下输出:

2012-06-12 11:02:50.651 Presenter[4660:603] Old size: frame={422, 351} image={168, 168}
2012-06-12 11:02:50.651 Presenter[4660:603] New size: frame={168, 168} image={168, 168}

当然,实际显示不会改变。

有趣的是,在 Interface Builder 中或以编程方式将 imageView 的框架样式更改为“无” [self.imageView setImageFrameStyle:NSImageFrameNone],让我的行为更接近我想要的。使图像变大,否则它会被图像视图剪切,确实会导致图像视图和窗口变大。然而,从这一点来看,缩小图像并不会导致图像视图或窗口相应地调整大小。“无”是唯一显示这种稍微正确的行为的图像框架样式——所有四种带边框的样式(即斜角[默认]、按钮、凹槽和照片)都显示了与上述相同的完全错误的行为。

我遇到了一个有类似问题的人。奇怪的是,当他的图像视图的框架样式设置为时,他只观察到有问题的行为NSImageFrameNone,而这是唯一给我一些正确行为的值。我尝试在调整大小之前将框架样式修改为非无值,之后修改为无,因为这解决了其他人的问题,但对我来说,这产生了与我最初将框架样式设置为“无”时相同的行为.

您提供的任何帮助将不胜感激。谢谢!

4

0 回答 0