isOpaque没有停止传递给父亲drawRect

时间:2014-02-15 16:45:12

标签: cocoa redraw nscollectionview setneedsdisplay nscollectionviewitem

我遇到了Cocoa及其View重绘层次结构的问题。

我正在测试米式控件中的显示(音频)级别,我正在使用Apple的MatrixMixerTest示例项目中的MeteringView类。这个类正在绘制仪表,只绘制了变化的差异,看起来像一个非常有效的类。

我的项目被拆分为2个拆分视图,其中一些是NSCollectionViews(Scrollview,Clipview),而其他只是静态视图。如果我将仪表添加到那些“静态”视图,当这些视图调用setNeedsDisplay:YES时,它们可以正常工作。如果将一个仪表添加到CollectionView项的视图中,它将被渲染,但会丢失其绘制的“旧级别”部件及其角落/背景。我认为这是因为CollectionView项目也被称为重绘(具有背景图像),一切都消失了。它正在绘制一些目前正在改变的部分(绘图工作)。

有没有办法阻止重新绘制Item本身?或者,我不知道为什么在这些静态视图中没有发生这种情况,因为这些视图也有背景图像,但不会在仪表上绘制。

CollectionView中是否有一些技巧或什么不同于“普通”视图?

编辑:阅读有关isOpaque(MeteringView isOpaque = YES)后,表示如果设置为yes,则不应调用父视图drawRect。那么适用于静态视图,那些MeteringViews不会调用父类drawRect,但是那些在CollectionView中会执行。我不知道为什么。

编辑2:我给了这个主题另一个标题,因为MeteringView中的isOpaque = YES并没有停止在CollectionView中调用父类drawRect,在正常视图中它正在工作。有什么需要了解的吗?我必须停止重绘CollectionView Item,因为这就是问题所在。

先谢谢你们

本杰明

1 个答案:

答案 0 :(得分:0)

isOpaque只是对系统的暗示。它不会阻止其他视图绘制其内容,这只意味着它有时可以跳过使其他视图更新其内容。

如果你的视图是不透明的,它应该将自己绘制为不透明并完全填充其边界。