2009-08-22 4 views
0

スーパービューでドラッグできるNSViewサブクラスがあります。私はmouseDraggedイベントハンドラでNSViewのsetFrameOriginメソッドとsetFrameRotationメソッドを呼び出すことによってビューを移動します。ビューは、呼び出しごとに移動および回転されます。NSViewは、最初のものが2番目に移動したときに別のNSViewにアーティファクトを残します。

これらのビューのインスタンスは、1つのスーパービューに含まれています。私が抱えている問題は、一方のビューが別のビューにドラッグされたときに、そのビューの上にアーチファクトが残ってしまうことです。私はa short videoを実際に記録しました。残念なことに、ビデオ圧縮のために、アーチファクトはあまり見えません。

私はこれが同時並進と回転に関係していると強く思っています。 Quartz Debugは、別のビューがドラッグされると、その閉塞(または閉塞)ビューの長方形が更新されることを示します(video here)。何とかこの矩形が描画エンジンによって誤って計算されているため、再描画する必要があるビューの一部は表示されません。

キッカーはこれをどう修正するかわかりません。私は手動で文書内の更新矩形を指定する方法を見つけることができませんし、何が起こる必要があるのは確かです。何か案は?ありがとう!

答えて

1

ます。またCALayersの代わりにビューを使用して検討するかもしれません。ビューとは異なり、レイヤーは、兄弟と積み重ねることを目的としたです。

最小限の労力で解決できる場合は、ビューをレイヤーバックアップしてみてください。この問題は解決しても解決しないかもしれませんが、試してみる価値があります。

+0

コアアニメーションを使用して、これらのビューのアニメーション化(別のビューを同じスロットにドラッグしたときに途中で動くような)のため、このソリューションは私にとって魅力的です。悲しいことに、ビューにレイヤーを渡すだけでは問題は解決しません(実際にそのレイヤーに描画することは、そのトリックを行う可能性があります)。ビューの代わりにCALayerを使用する場合は、イベントにどのように応答するのですか? CALayersはNSRespnderから継承しません。 (申し訳ありませんが、私はCocoa n00bで、Core Animationについては基本的に無関係です) –

+0

私の理解では、レイヤー階層全体をホストして制御する単一のビューであっても、あるレベルで少なくとも1つのビューが必要です。この配置では、ビューは、ユーザーがどのレイヤーで作業しているかを判断するために、 'hitTest:'などのメッセージを使用して、イベントを処理します。 –

+0

私はそれが間違っていたことが判明しました。私が(プログラムで作成した)私のビューにCALayerバッキングを与えるための適切なメソッドを呼び出すと、そのアーティファクトはなくなりました。もちろん、私のポジショニングとローテーションは壊れていますが、それは手元の問題ではありません。提案していただきありがとうございます! –

0

実際には、インタラクティブに表示されるようにデザインされていません。できますが、エッジのケースは豊富です。

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

変換されたビューを上にドラッグする場合は、ドラッグしているビューの下にあるビューの四角形を無効にする必要があります。矩形は、ドラッグされているビューによって隠されている総面積(回転していない/変形していない)よりも数ピクセルだけ大きくする必要があります。アーチファクトは、事実上、丸め誤差によって引き起こされます。対角線は、ラスタ描画システム上の見積もりに過ぎません。

は、メソッドを参照してください:

- (void)setNeedsDisplayInRect:(NSRect)invalidRect; 
関連する問題