当第一个NSView在第二个NSView上移动时,NSView会将工件留在另一个NSView上

时间:2009-08-22 23:06:43

标签: cocoa drawing nsview

我有一个可以在其superview中拖动的NSView子类。我通过在mouseDragged事件处理程序中调用NSView的setFrameOrigin和setFrameRotation方法来移动视图。每次调用都会移动和旋转视图。

我有一个超级视图包含这些视图的多个实例。我遇到的问题是,当一个视图被拖到另一个视图上时,它会在视图上留下瑕疵。我在行动中记录了a short video。不幸的是,由于视频压缩,工件不是很明显。

我强烈怀疑这与同步翻译和轮换有关。 Quartz Debug显示遮挡(或遮挡)视图的矩形在另一个视图被拖过它时会更新(video here);不知怎的,这个矩形被绘图引擎误算了,所以应该重绘的部分视图不是。

踢球者是我不知道如何解决这个问题。我找不到任何方法在文档中手动指定更新rect,也不确定是什么需要发生。有任何想法吗?谢谢!

2 个答案:

答案 0 :(得分:1)

您可能还会考虑使用CALayers而不是视图。与视图不同,图层 旨在与其兄弟姐妹一起堆叠。

对于可能的最小努力解决方案,尝试使视图层支持;它可能会或可能不会解决这个问题,但值得一试。

答案 1 :(得分:0)

视图并非真正设计为以交互方式堆叠。可以做到,但边缘情况比比皆是。

通常,对于这类事情,如果要进行视图内拖动(参见草图示例),则可以使用类似Cell的基础结构,如果要在视图之间拖动,则可以使用拖放式基础结构或Windows(或应用程序)。

如果您确实想要在顶部拖动变换后的视图,则需要使拖动视图下方视图的矩形无效。矩形需要比被拖动视图遮挡的总面积(未旋转/未变换)大几个像素。这些工件实际上是由舍入误差引起的;对角线只是光栅绘图系统的估计值。

见方法:

- (void)setNeedsDisplayInRect:(NSRect)invalidRect;