0

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

我有一个超级视图包含的这些视图的多个实例。我遇到的问题是,当一个视图被拖到另一个视图上时,它会在它正在遮蔽的视图上留下伪影。我录制了一个简短的视频。不幸的是,由于视频压缩,伪影不是很明显。

我强烈怀疑这与同声翻译和旋转有关。Quartz Debug 显示,当另一个视图被拖过时,遮挡(或被遮挡)视图的矩形会更新(此处为视频);不知何故,这个矩形被绘图引擎误算了,所以应该重绘的部分视图不是。

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

4

2 回答 2

1

您也可以考虑使用 CALayers 代替视图。与视图不同,图层旨在与其兄弟姐妹堆叠

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

于 2009-08-23T01:56:40.530 回答
0

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

一般来说,对于这种事情,如果你想在视图中拖动,你会使用类似 Cell 的基础设施(参见 Sketch 示例),如果你想在视图或窗口之间拖动,你会使用拖放基础设施(或应用程序)。

如果您真的想将转换后的视图拖到顶部,则需要使被拖动视图下方的视图矩形无效。矩形需要比被拖动的视图遮挡的总区域(未旋转/未转换)大几个像素。伪影实际上是由舍入误差引起的;对角线只是对光栅绘图系统的估计。

见方法:

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