2016-05-16 7 views
1

NSScrollViewのサイズを変更すると、そのドキュメントビュー(NSImageView)のサイズが水平方向(上方向または下方向)に変更されるように、NSScrollViewにNSImageViewを埋め込みたいとします。 NSScrollViewの幅に合わせて、その内容は画像のアスペクト比を保持するようにスケーリングされます。結果的に、NSImageViewはNSScrollViewによってクリップされる場合とされない場合があり、垂直スクロールが可能です。NSImageView:コンテナ横幅、縦アスペクトスケール

これは事をより明確にすることができます:私が望むものが私のプログラムの「表示」メニューのメニューオプションを持っていたら、「水平に収まるようにズームする」というタイトルになります。

  1. をレイアウトエディタでNSImageViewを作成します。ここでは

    は、私がやったものです。

  2. "埋め込み..."を使用して、NSScrollViewに埋め込みます。
  3. NSImageViewの属性エディタで[スケーリング]オプションを「比例的に上または下」に設定します。
  4. NSScrollViewの余白をコンテナに固定するための制約を追加します。
  5. NSImageViewの左右をコンテナに固定するための制約を追加します。
  6. 予想通りNSScrollViewがリサイズ251

にNSImageViewの水平コンテンツ圧縮抵抗優先度を減らし。 NSImageViewの左と右(または自動レイアウト制約用語で "leading"と "trailing")のマージンは、NSScrollViewと一致するように制限されています。 NSImageViewの画像は、NSScrollViewに収まるように比例して縮小されます。垂直スクロールは、NSScrollViewがイメージ全体を表示するのに十分な高さでない場合に可能です。

2つの問題があります。

まず、NSImageViewは、アスペクト比を維持するために、必要に応じて、その垂直方向のサイズを増大させるが、NSScrollViewが収縮するとき(含むウィンドウを小さくするため、すなわち、)NSImageViewは決してその垂直方向のサイズを縮小しません。その結果、画像の上下に空きスペースができることがあります。

ウィンドウのサイズが大きくなると、レイアウトエンジンはNSImageViewに水平方向が大きくなることを伝え、NSImageViewはコンテンツのサイズを変更する必要があると判断します - 手順3)を指示され、のように垂直方向に大きくなると言います。ウィンドウが小さくなると、NSImageViewは水平方向に縮小されることを知りますが、空白を含むことに問題はないので、垂直方向に小さくするようには要求しません。

私は、垂直方向のコンテンツの圧縮と抱き合わせの優先順位で再生しようとしましたが、NSImageViewの優先度の低い高さの制約を= 1(および> = 1)に設定することで、これを穏やかに他のいくつかの制約と矛盾することなくできるだけ小さいものですが、これは私が自動レイアウトの理解が非常に乏しいことを教えてくれます。

NSImageViewの水平サイズが変更されていることを知るとき、NSImageViewの垂直サイズをプログラムでリセットする必要がありますか?

第2の問題は、画像が自然なサイズを超えて水平に拡大しないことです。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. 画像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
関連する問題