0

スーパービューでドラッグできる NSView サブクラスがあります。mouseDragged イベント ハンドラーで NSView の setFrameOrigin メソッドと setFrameRotation メソッドを呼び出して、ビューを移動します。ビューは、呼び出しごとに移動および回転されます。

単一のスーパービューに含まれるこれらのビューの複数のインスタンスがあります。私が抱えている問題は、あるビューが別のビューにドラッグされると、見えなくなっているビューにアーティファクトが残ることです。この動作の短いビデオを録画しました。残念ながら、ビデオ圧縮のため、アーティファクトはあまり見えません。

これは同時平行移動と回転が関係しているのではないかと強く疑っています。Quartz Debug は、別のビューがドラッグされると、閉塞 (または閉塞) ビューの長方形が更新されることを明らかにします (ビデオはこちら)。どういうわけか、この四角形は描画エンジンによって誤って計算されているため、再描画する必要があるビューの一部はそうではありません。

キッカーは、これを修正する方法がわかりません。ドキュメントで update rect を手動で指定する方法が見つかりません。また、それが必要かどうかもわかりません。何か案は?ありがとう!

4

2 に答える 2

1

ビューの代わりに CALayers の使用を検討することもできます。ビューとは異なり、レイヤー兄弟と重ねられることを意図しています。

考えられる最も簡単な解決策として、ビューをレイヤーでサポートするようにしてみてください。この問題を解決する場合としない場合がありますが、試してみる価値はあります。

于 2009-08-23T01:56:40.530 に答える
0

ビューは、実際にはインタラクティブな方法で積み重ねられるように設計されていません。実行できますが、エッジケースがたくさんあります。

一般に、この種の場合、ビュー内ドラッグを実行する場合はセルのようなインフラストラクチャを使用し(スケッチの例を参照)、ビューまたはウィンドウ間をドラッグする場合はドラッグアンドドロップインフラストラクチャを使用します(またはアプリ)。

変換されたビューを本当に上にドラッグしたい場合は、ドラッグされているビューの下にあるビューの長方形を無効にする必要があります。長方形は、ドラッグされているビューによって隠されている合計領域(回転されていない/変換されていない)よりも数ピクセル大きくする必要があります。アーティファクトは、事実上、丸め誤差によって引き起こされます。対角線は、ラスター描画システムの単なる見積もりです。

方法を参照してください。

- (void)setNeedsDisplayInRect:(NSRect)invalidRect;
于 2009-08-22T23:41:40.437 に答える