境界の原点を変更+画像をトリミング
-
28-10-2019 - |
質問
私はCocoaの初心者ですが、NSImageに関していくつか疑問があります。
質問1:
画像の境界の原点を変更しても効果がないようです。新しく設定した原点からイメージを描くことを期待していましたが、そうではないようです。何か足りないのですか?
コード: ジェネラコディセタグプレ
注:imageViewはIBOutletです
質問2:
画像を切り抜こうとしましたが、画像を切り抜いていないようです。画像全体を見ることができます。私が行方不明になっているのは何ですか?
コード: ジェネラコディセタグプレ
ありがとう
解決
画像の境界の原点を変更しても効果がないようです。 … ジェネラコディセタグプレ
これは画像ビューであり、画像ではありません。
ビューの境界を変更した場合の効果は、ビューが描画する内容によって異なります。事実上、これは、作成したビュークラスのインスタンスではないビューの境界を変更しないことを意味します。これは、NSImageViewがそのイメージをどのように描画するかを正確に予測できないためです(おそらく、コントロールであるため、そのセルが含まれますが、それ以上に、私は依存しません。
より一般的には、ビューの境界の原点を変更することは非常にまれです。私は今までにそれをしたことを覚えていません、そして私はそれをするために頭のてっぺんから理由を考えることができません。境界サイズを変更すると、トリミングではなく拡大縮小されます。
画像を切り抜こうとしましたが、画像を切り抜いていないようです。画像全体を見ることができます。私が行方不明になっているのは何ですか? ジェネラコディセタグプレ
画像に描画するように指示しても、画像については何も変わりません。その後、画像が小さくなったり大きくなったりするように「画像をトリミング」することはありません。描くように言っているだけです。
したがって、その後のステートメントは、画像に描画するように指示しても違いがないため、画像に描画するように指示しなかったかのように、画像ビューの画像を画像全体に設定します。
画像に描画するように指示することは、まさにそれです。画像に描画するように指示します。それを行う正しい場所は2つだけです:
- ビューまたは画像への
lockFocus
メッセージとunlockFocus
メッセージの間(または現在のNSGraphicsContextを設定した後)。- ビューの
drawRect:
メソッド内。他の場所では、Cocoaオブジェクトに描画するように指示しないでください。
画像を切り抜く正しい方法の1つは、目的の/調整されたサイズの新しい画像を作成し、その画像にフォーカスを固定し、元の画像の目的の部分をその画像に描画して、新しい画像のフォーカスのロックを解除することです。これで、元のバージョンとトリミングされたバージョンの両方が作成されます。
もう1つの正しい方法は、2つのプロパティを持つ独自のカスタム画像ビューを作成することです。1つは描画する画像を所有し、もう1つは長方形を保持します。描画するように指示されると、このカスタムビューは、指定された長方形をビューの境界に描画するように画像に指示します。そうすれば、常に元の画像を保持し、目的のセクションのみを描画するだけです。