スーパービューでドラッグできるNSViewサブクラスがあります。私はmouseDraggedイベントハンドラでNSViewのsetFrameOriginメソッドとsetFrameRotationメソッドを呼び出すことによってビューを移動します。ビューは、呼び出しごとに移動および回転されます。NSViewは、最初のものが2番目に移動したときに別のNSViewにアーティファクトを残します。
これらのビューのインスタンスは、1つのスーパービューに含まれています。私が抱えている問題は、一方のビューが別のビューにドラッグされたときに、そのビューの上にアーチファクトが残ってしまうことです。私はa short videoを実際に記録しました。残念なことに、ビデオ圧縮のために、アーチファクトはあまり見えません。
私はこれが同時並進と回転に関係していると強く思っています。 Quartz Debugは、別のビューがドラッグされると、その閉塞(または閉塞)ビューの長方形が更新されることを示します(video here)。何とかこの矩形が描画エンジンによって誤って計算されているため、再描画する必要があるビューの一部は表示されません。
キッカーはこれをどう修正するかわかりません。私は手動で文書内の更新矩形を指定する方法を見つけることができませんし、何が起こる必要があるのは確かです。何か案は?ありがとう!
コアアニメーションを使用して、これらのビューのアニメーション化(別のビューを同じスロットにドラッグしたときに途中で動くような)のため、このソリューションは私にとって魅力的です。悲しいことに、ビューにレイヤーを渡すだけでは問題は解決しません(実際にそのレイヤーに描画することは、そのトリックを行う可能性があります)。ビューの代わりにCALayerを使用する場合は、イベントにどのように応答するのですか? CALayersはNSRespnderから継承しません。 (申し訳ありませんが、私はCocoa n00bで、Core Animationについては基本的に無関係です) –
私の理解では、レイヤー階層全体をホストして制御する単一のビューであっても、あるレベルで少なくとも1つのビューが必要です。この配置では、ビューは、ユーザーがどのレイヤーで作業しているかを判断するために、 'hitTest:'などのメッセージを使用して、イベントを処理します。 –
私はそれが間違っていたことが判明しました。私が(プログラムで作成した)私のビューにCALayerバッキングを与えるための適切なメソッドを呼び出すと、そのアーティファクトはなくなりました。もちろん、私のポジショニングとローテーションは壊れていますが、それは手元の問題ではありません。提案していただきありがとうございます! –