【问题标题】:NSImageView resized with image sizeNSImageView 随图像大小调整大小
【发布时间】:2013-08-26 19:25:01
【问题描述】:

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

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

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

  • 查看
    • NSScrollView
      • 查看
        • NSImageView


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

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


注意:滑块似乎在移动视图而不是图像
注意 2:我无法将窗口大小调整为小于图像的大小

【问题讨论】:

  • “滑块似乎在移动视图而不是图像”是什么意思?
  • 我的意思是当我滚动到顶部/底部时,我们可以看到视图正在移动,并自动返回到默认位置。
  • 好的。我明白你的问题是什么。你所描述的对我来说听起来就像你的 NSScrollView 里面的视图不够大。因为clip subviews 可能未启用,您仍然可以看到 NSImageView 超出其边界。之所以可以滚动并返回其原始位置,是因为一个称为弹跳的功能,它是 NSScrollView 的一部分。您能否调试您的应用程序并检查yournsimageviewyourscrollview.view 的大小。

标签: objective-c cocoa nsimage nsscrollview nsimageview


【解决方案1】:

我对 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 框架比窗口大是可以的——这就是让你在它周围滚动的原因。

【讨论】:

  • 感谢您的回答,但我真的很想使用 Interface Builder 来完成这项任务!使用我拥有的实际代码,我不确定我是否可以使用您的解决方案..
  • Interface Builder 说得够好,但希望您意识到这几乎是创建满足您需求的 NSScrollView 所需的最少代码。这与 Interface Builder 在幕后所做的事情是一样的——你在 Interface Builder 中所做的所有设置和选择基本上只是告诉它在你的应用程序启动时执行这样的代码。因此,如果您无法找到一种方法让您的代码使用类似的功能,那么您的代码可能存在更根本的问题。
  • 我认为在这里尝试代码可能更好的另一个原因(除了我不知道 Interface Builder 的答案)是 IB有一百万个小复选框和设置隐藏在各个窗格中,如果您没有将它们全部选中和取消选中并且选择得恰到好处,事情可能不会按预期工作。然而,如果有人给你提供了已知可以工作的代码,并且你将其粘贴进去,它应该仍然可以工作——你不必担心你错过的某个地方有一个复选框会破坏你的应用程序。
【解决方案2】:

在我看来,您的视图大小不合适。由于弹跳并且因为您的视图不会剪切它们的子视图,您仍然可以滚动一点,但它会返回到原来的位置。

  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;

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

如果这对你有用,也请给马特一些信任,通过对他的回答进行投票,因为他的回答基本上做同样的事情 - 仅基于代码,而不是使用 nib 文件初始化所有内容 - 并且我使用的代码与他已经发布的非常相似。

【讨论】:

  • 非常感谢,您的myScrollView.view(忘记使用“内部”视图)有效!别担心,他是从 StackOverflow 开始的,我会在这里给他的每个答案 +1,因为这也是很好的答案:)!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多