我有一个包含动态生成的 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
,而这是唯一给我一些正确行为的值。我尝试在调整大小之前将框架样式修改为非无值,之后修改为无,因为这解决了其他人的问题,但对我来说,这产生了与我最初将框架样式设置为“无”时相同的行为.
您提供的任何帮助将不胜感激。谢谢!