NSImageView使用图像大小调整大小

时间:2013-08-23 16:49:04

标签: objective-c cocoa nsimage nsscrollview nsimageview

我是Obj-C / Cocoa编程的新手,面对NSImageView的问题。
我的目标是创建一个应用程序,允许用户通过拖放操作在其上放置图像。

问题如下:当我们丢弃的图像大于窗口时,它会将窗口大小调整为图像大小,我不希望! 我将我的NSImageView放入NSScrollView中,因此只显示图像的某一部分必须,用户将移动滑块以查看整个(或简单地调整窗口大小),这就是我想要的...

这是我的XIB层次结构(相关部分):

  • 查看
    • NSScrollView
      • 查看
        • NSImageView


在我的NSImageView的代码中,我(关于那个问题):

[self setImageScaling:NSScaleProportionally];
[self setImage:newImage];


注意:滑块似乎移动视图而不是图像
NOTE2 :我无法将窗口调整为比图像小的尺寸

2 个答案:

答案 0 :(得分:4)

我对nib文件有一种可怕的厌恶,并且喜欢在可能的情况下以编程方式执行操作,所以我对此没什么帮助...但是这里有一个小的NSScrollview测试应用程序列表,我最近编写了类似的东西。此代码块中提到的唯一非自包含的东西是window名称,它指的是已创建的窗口的NSWindow *。而self这里只是指控制器对象。

NSImage * myImage       = [NSImage imageNamed:@"myfilename.png"];
NSRect imageRect        = NSMakeRect(0.0,0.0,myImage.size.width,myImage.size.height);


self.myImageView        = [[NSImageView alloc] initWithFrame:imageRect];
self.myImageView.bounds = imageRect;
self.myImageView.image  = myImage;

self.myScrollView       = [[NSScrollView alloc] initWithFrame:[window.contentView frame]];
self.myScrollView.hasVerticalScroller = YES;
self.myScrollView.hasHorizontalScroller = YES;
self.myScrollView.documentView = self.myImageView;
self.myScrollView.borderType = NSNoBorder;
self.myScrollView.scrollerStyle = NSScrollerStyleOverlay;

window.contentView      = self.myScrollView;

我知道这可能不是您正在寻找的解决方案,但也许它可以帮助您调试?特别是,除了给它一个框架,一个边界矩形和一个NSImageView之外,我没有对我的NSImage *做任何有趣的事情,所以我认为你不需要担心每个缩放参数事实上,如果你想让图像全尺寸并滚动它,你希望你的NSImageView的框架与图像的尺寸相同,这样它就无法扩展一点都不也许那是你的问题 - 框架太小了? NSImageView帧可以比窗口大 - 这就是让你滚动它的原因。

答案 1 :(得分:1)

对我而言,听起来你的观点没有合适的尺寸。由于弹跳并且因为您的视图没有剪切其子视图,您仍然可以滚动一点,但它会返回到其原始位置。

  1. 检查NSImageView是否足以显示完整图像。 (检查宽度和高度的框架或边界)

    如果它不够大(在设置新图像的方法内):

    self.myImageView.frame = NSMakeRect(0.0,0.0, self.myImageView.image.size.width, self.myImageView.image.size.height);

  2. 相应地调整滚动视图视图的大小。

    self.myScrollView.view.frame = self.myImageView.frame;

  3. 现在,您的可滚动区域应足够大,以覆盖整个图像。

    如果这对您有用,也可以通过对他的答案进行投票来给予Matt一些信任,因为他的回答基本上是相同的 - 只有基于代码的,而不是使用nib文件初始化所有内容 - 以及我使用的代码与他已发布的代码非常相似。