1

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

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

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

  • 看法
    • NSScrollView
      • 看法
        • NSImageView


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

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


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

4

2 回答 2

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

于 2013-08-25T15:33:21.727 回答
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;

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

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

于 2013-09-02T13:05:55.877 回答