NSImageView:水平适合容器宽度,垂直宽高比例

时间:2016-05-16 23:50:59

标签: cocoa autolayout nsscrollview nsimageview

我希望在NSScrollView中嵌入一个NSImageView,这样当调整NSScrollView的大小时,它的文档视图(即NSImageView)会水平调整(向上或向下)以匹配NSScrollView的宽度,同时缩放其内容保留图像的宽高比。因此,NSScrollView可能会或可能不会剪切NSImageView,也可能会进行垂直滚动。

这可能会让事情变得更清楚:如果我想要的话在我的程序中有一个菜单选项" View"菜单,标题为“#34;缩放以适合水平放置。”#34;

这就是我所做的:

  1. 在布局编辑器中创建NSImageView。
  2. 使用"嵌入......"将其嵌入NSScrollView。
  3. 启用"按比例向上或向下"对于" Scaling" NSImageView的属性编辑器中的选项。
  4. 添加约束以将NSScrollView的边距固定到其容器。
  5. 添加约束以将NSImageView的左侧和右侧固定到其容器。
  6. 将NSImageView的水平内容抗压缩优先级降低到251。
  7. NSScrollView按预期调整大小。 NSImageView的左右(或#34;前导"和#34;尾随,"在自动布局约束用语中)边距被约束为与NSScrollView匹配。 NSImageView中的图像将按比例缩小,以便它适合NSScrollView。当NSScrollView不够高以显示整个图像时,可以进行垂直滚动。

    有两个问题。

    首先,NSImageView将根据需要增加其垂直大小以保持宽高比,但是当NSScrollView缩小时(即,因为包含的窗口变小),NSImageView永远减少其垂直大小。因此,图像上方和下方可能会有一堆空白空间。

    我可疑的猜测是,这里的内容是:当窗口增长时,布局引擎告诉NSImageView它会在水平上变大,而NSImageView会发现它必须调整其内容的大小(按照指示执行 - 第3步)并说它喜欢垂直放大。当窗口变小时,NSImageView会知道它会水平收缩,但它没有包含空白空间的问题,所以它不要求垂直放小。

    我尝试过使用垂直内容压缩和拥抱优先级,以及在NSImageView上设置= 1(和> = 1)的低优先级高度约束,希望这会轻轻地鼓励它尽可能小,不要与其他约束相矛盾,但这样做教会了我对自动布局的理解很差。

    当我知道NSImageView的水平大小正在改变时,是否需要以编程方式重置NSImageView的垂直大小?

    第二个问题是图像不会水平生长超过其自然尺寸。由于NSImageView受限于其前沿/后缘以匹配其容器,并且因为它被告知要向上或向下扩展其内容,我甚至无法猜测为什么会发生这种情况。

1 个答案:

答案 0 :(得分:1)

当图像视图中的图像被更新时,以编程方式应用这些约束似乎可以解决这个问题:

float aspect = image.size.height / image.size.width;
[imageView.heightAnchor constraintEqualToAnchor:imageView.widthAnchor
                                     multiplier:aspect].active = YES;
[scrollView.superview.heightAnchor constraintLessThanOrEqualToAnchor:imageView.heightAnchor].active = YES;

这是在界面构建器中创建的以下约束的补充:

  1. Image View.top = Superview.top
  2. Image View.leading = Superview.leading
  3. Image View.trailing = Superview.trailing
  4. Superview.bottom = Scroll View.bottom - 1
  5. Superview.top = Scroll View.top - 1
  6. Superview.leading = Scroll View.leading - 1
  7. Superview.trailing = Scroll View.trailing - 1