2016-05-16 53 views
1

我希望在NSScrollView中嵌入一個NSImageView,以便當NSScrollView調整大小時,其文檔視圖(即NSImageView)水平調整大小(向上或下來)以匹配NSScrollView的寬度,同時縮放內容以保持圖像的寬高比。因此,NSImageView可能會或可能不會被NSScrollView剪切,並且可能會進行垂直滾動。NSImageView:水平適合容器寬度,垂直方面尺度

這可能會讓事情變得更加清楚:如果我想在我的程序的「查看」菜單下有一個菜單選項,它的標題是「縮放以適應水平」。

這裏是我做了什麼:

  1. 在佈局編輯器創建一個NSImageView。
  2. 使用「嵌入...」將其嵌入到NSScrollView中。
  3. 對於NSImageView的屬性編輯器中的「縮放」選項啓用「按比例向上或向下」。
  4. 添加約束以將NSScrollView的邊距固定到其容器。
  5. 添加約束以將NSImageView的左側和右側固定到其容器。
  6. 降低NSImageView的水平內容壓縮阻力優先251.

的NSScrollView調整大小按預期方式。 NSImageView的左右邊界(或自動佈局約束條件中的「前導」和「尾隨」邊界)被限制爲匹配NSScrollView。 NSImageView中的圖像將按比例縮小比例,以適合NSScrollView。當NSScrollView的高度不足以顯示整個圖像時,可以進行垂直滾動。

有兩個問題。首先,NSImageView將根據需要增加垂直尺寸以保持寬高比,但是當NSScrollView縮小時(即因爲包含窗口變小),NSImageView永不減少其垂直尺寸。因此,圖像上方和下方可能會有一堆空的空間。

我對這裏發生的事情的猜測不足是:當窗口增長時,佈局引擎告訴NSImageView它將水平放大並且NSImageView發現它必須調整它的內容大小(因爲它具有被指示做 - 步驟3)並且說它會垂直放大。當窗口縮小時,NSImageView會知道它會水平縮小,但它沒有包含空白的問題,所以它不會要求垂直變小。

我試着玩垂直內容壓縮和擁抱優先級,以及在NSImageView上設置一個低優先級高度約束= 1(和> = 1),希望這會輕輕地鼓勵它作爲儘可能小而不會與其他約束相矛盾,但這樣做已經教會了我,我對自動佈局的理解很差。

當我得知它的水平尺寸正在改變時,是否需要以編程方式重置NSImageView的垂直尺寸?

第二個問題是圖像不會水平增長超過其自然尺寸。由於NSImageView被限制在其前端/後端以匹配其容器,並且因爲已經被告知要將其內容向上或向下縮放,所以我甚至不能猜測爲什麼會發生這種情況。

+0

我已經確定,在調整NSImageView的大小時,它的寬度根據放置在其前緣和後緣上的約束條件而改變,但其高度從不改變。其高度設置爲_unscaled_圖像的高度。看起來圖像縮放時內容高度不會更新。 – Jamborino

回答

0

編程應用這些約束條件時,在圖像視圖更新的形象似乎這樣的伎倆:

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 =滾動View.bottom - 1
  5. Superview.top =滾動View.top - 1
  6. Superview.leading =滾動View.leading - 1
  7. Superview.trailing =滾動View.trailing - 1