我希望在NSScrollView中嵌入一個NSImageView,以便當NSScrollView調整大小時,其文檔視圖(即NSImageView)水平調整大小(向上或下來)以匹配NSScrollView的寬度,同時縮放內容以保持圖像的寬高比。因此,NSImageView可能會或可能不會被NSScrollView剪切,並且可能會進行垂直滾動。NSImageView:水平適合容器寬度,垂直方面尺度
這可能會讓事情變得更加清楚:如果我想在我的程序的「查看」菜單下有一個菜單選項,它的標題是「縮放以適應水平」。
這裏是我做了什麼:
- 在佈局編輯器創建一個NSImageView。
- 使用「嵌入...」將其嵌入到NSScrollView中。
- 對於NSImageView的屬性編輯器中的「縮放」選項啓用「按比例向上或向下」。
- 添加約束以將NSScrollView的邊距固定到其容器。
- 添加約束以將NSImageView的左側和右側固定到其容器。
- 降低NSImageView的水平內容壓縮阻力優先251.
的NSScrollView調整大小按預期方式。 NSImageView的左右邊界(或自動佈局約束條件中的「前導」和「尾隨」邊界)被限制爲匹配NSScrollView。 NSImageView中的圖像將按比例縮小比例,以適合NSScrollView。當NSScrollView的高度不足以顯示整個圖像時,可以進行垂直滾動。
有兩個問題。首先,NSImageView將根據需要增加垂直尺寸以保持寬高比,但是當NSScrollView縮小時(即因爲包含窗口變小),NSImageView永不減少其垂直尺寸。因此,圖像上方和下方可能會有一堆空的空間。
我對這裏發生的事情的猜測不足是:當窗口增長時,佈局引擎告訴NSImageView它將水平放大並且NSImageView發現它必須調整它的內容大小(因爲它具有被指示做 - 步驟3)並且說它會像垂直放大。當窗口縮小時,NSImageView會知道它會水平縮小,但它沒有包含空白的問題,所以它不會要求垂直變小。
我試着玩垂直內容壓縮和擁抱優先級,以及在NSImageView上設置一個低優先級高度約束= 1(和> = 1),希望這會輕輕地鼓勵它作爲儘可能小而不會與其他約束相矛盾,但這樣做已經教會了我,我對自動佈局的理解很差。
當我得知它的水平尺寸正在改變時,是否需要以編程方式重置NSImageView的垂直尺寸?
第二個問題是圖像不會水平增長超過其自然尺寸。由於NSImageView被限制在其前端/後端以匹配其容器,並且因爲已經被告知要將其內容向上或向下縮放,所以我甚至不能猜測爲什麼會發生這種情況。
我已經確定,在調整NSImageView的大小時,它的寬度根據放置在其前緣和後緣上的約束條件而改變,但其高度從不改變。其高度設置爲_unscaled_圖像的高度。看起來圖像縮放時內容高度不會更新。 – Jamborino