我希望在NSScrollView中嵌入一个NSImageView,这样当调整NSScrollView的大小时,它的文档视图(即NSImageView)会水平调整(向上或向下)以匹配NSScrollView的宽度,同时缩放其内容保留图像的宽高比。因此,NSScrollView可能会或可能不会剪切NSImageView,也可能会进行垂直滚动。
这可能会让事情变得更清楚:如果我想要的话在我的程序中有一个菜单选项" View"菜单,标题为“#34;缩放以适合水平放置。”#34;
这就是我所做的:
NSScrollView按预期调整大小。 NSImageView的左右(或#34;前导"和#34;尾随,"在自动布局约束用语中)边距被约束为与NSScrollView匹配。 NSImageView中的图像将按比例缩小,以便它适合NSScrollView。当NSScrollView不够高以显示整个图像时,可以进行垂直滚动。
有两个问题。
首先,NSImageView将根据需要增加其垂直大小以保持宽高比,但是当NSScrollView缩小时(即,因为包含的窗口变小),NSImageView永远减少其垂直大小。因此,图像上方和下方可能会有一堆空白空间。
我可疑的猜测是,这里的内容是:当窗口增长时,布局引擎告诉NSImageView它会在水平上变大,而NSImageView会发现它必须调整其内容的大小(按照指示执行 - 第3步)并说它喜欢垂直放大。当窗口变小时,NSImageView会知道它会水平收缩,但它没有包含空白空间的问题,所以它不要求垂直放小。
我尝试过使用垂直内容压缩和拥抱优先级,以及在NSImageView上设置= 1(和> = 1)的低优先级高度约束,希望这会轻轻地鼓励它尽可能小,不要与其他约束相矛盾,但这样做教会了我对自动布局的理解很差。
当我知道NSImageView的水平大小正在改变时,是否需要以编程方式重置NSImageView的垂直大小?
第二个问题是图像不会水平生长超过其自然尺寸。由于NSImageView受限于其前沿/后缘以匹配其容器,并且因为它被告知要向上或向下扩展其内容,我甚至无法猜测为什么会发生这种情况。
答案 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;
这是在界面构建器中创建的以下约束的补充: