5

サイズを変更できる長方形の境界ボックスを使用して、ユーザーが画像の複数の領域を指定できるようにするアプリを構築しようとしています。

これまでのところ、ユーザーが必要に応じて画像を拡大したりスクロールしたりできるように、NSScrollViewを含むを取得しました。NSImageView私の現在の考えではNSViews、ユーザーが目的の領域をカバーするように配置してサイズを変更し、NSViewフレームを画像サイズのパーセンテージに変換して、後で使用するためにそれらの値を保存できるバウンディング ボックスを提供する方法として使用できると考えています。

ユーザーが現在見ている場所の中心にをaddAreaToImage追加する方法があります。私が望むのは、ユーザーが領域の隅をクリックしてドラッグして、好きな場所にサイズ変更/移動できるようにすることです。必要に応じて、ライブ バウンディング ボックスのようなものです。NSViewNSScrollView

ドキュメントを読んだ後、ドラッグに関連するほとんどのことは、NSView を他のもの (画像など) をドラッグする場所にするか、スーパービューのサイズが変更されたためにサイズを変更することです。どちらも私が探しているものではありません。

私が恐れているのは、この問題に対する答え (または、私が独自の解決策を展開できるようになる一連の答え)が非常に基本的なものであるため、誰もそれらについて考えたことがないということです。私のため。

私は iOS 開発の出身なので、これは完全に新しい領域ではありませんが、NSView と UIView には、これまでのところ完全に混乱させるほどの違いがあるようです。

4

1 に答える 1

12

はい、自分で実装する必要がありますが、それほど複雑ではありません。

最初に、エリア ビューの動作と外観についていくつかの決定を行う必要があります。ビューのサイズを変更したり、ビューをドラッグ (移動) したりする必要がありますか? パッシブ/ドラッグ/サイズ変更/ハイライトされたときの描画方法。サイズを変更してカーソルをドラッグしますか? サイズ変更の動作は何ですか? 角またはすべての境界線をドラッグするだけですか? ドラッグ枠の幅は?

次に、エリア ビューとして使用している NSView をサブクラス化します。状態を示すためにいくつかのプライベート メンバーを指定します (isDragged、isResized など)。

drawRect:ビューを描画するために実装します。さまざまな状態を考慮してください (たとえば、ドラッグまたはサイズ変更されているときに視覚化する、透明なオーバーレイを描画するなど)。

次に、、、および多分を実装して、マウス イベントを処理します。ここにサイズ変更/ドラッグ ロジックが配置されます。ユーザーが最初にクリックした場所を確認し、その時点から可能な操作を決定して、関連する状態を設定します。フォローアップして操作を実行します (ビューのフレームの原点とサイズを適宜設定します)。操作を終了します(検証、状態の設定、完了ロジックの呼び出し、元に戻す操作の登録)mouseDown:mouseDragged:mouseUp:mouseMoved:mouseDown:mouseDragged:mouseUp:

点と四角形を扱うときは、座標系を忘れないでください。それらをビューとベース システムとの間で変換する必要があります。NSView には、これに必要なすべてのメソッドがあります。

サイズと位置の変更を反映するために、ビュー自体を再描画するたびにsetNeedsDisplay:orを呼び出す必要があります。setNeedsDisplayInRect:

また、別のカーソルが必要なビュー内の領域にトラッキング エリアを使用することもできます (例: コーナーのカーソルのサイズを変更する)。

ドラッグ/サイズ変更するときは、ユーザーがマウスを親のビュー境界の外にドラッグしたことに応答するためのロジックを実装することを忘れないでください。

ところで、なぜスクロールビューにビューを追加するのですか? スクロールできるように、イメージビュー(可能であれば)またはクリップビューのサブビューとして配置する方がよいと思います。

于 2013-10-16T10:47:23.160 に答える