setNeedsDisplay未按预期在子视图中触发drawRect



我正在与setNeedsDisplay作斗争。我认为它应该为调用它的视图和下面的层次结构触发对drawRect:的调用,如果它在视图的边界内,但我发现事实并非如此。这是我的设置:

在应用程序代理中,我创建了一个视图,其大小是一个正方形,基本上覆盖了整个屏幕的实际区域。此视图称为TrollCalendarView。除了指南针触发的旋转之外,TrollCalendarView没有发生太多事情。

TrollCalendarView有7个子视图,称为PlatformView,旨在包含以7边排列方式围绕TrollCalendarView的中心排列的2D绘制对象。因此,当iPad旋转时,这7个视图会旋转,使它们始终与基本方向一致。

每个CCD_ 8子视图包含3个子视图,称为CCD_。每个塔包含在drawRect:中实现的二维绘制对象。

因此,总的来说,我有空drawRect:TrollCalendarView,以及分别具有drawRect实现的子视图PlatformViewPlatformview->Tower。此外,Tower位于Platform的边界内,Platform位于TrollCalendarView的边界内。

TrollCalendarView中,我添加了一个滑动识别器。当我滑动时,会更新一个属性,并调用[self setNeedsDisplay],但似乎什么都没发生。我在每个视图中都向drawRect:方法添加了NSLog条目,并且只调用了TrollCalendarViewdrawRect:方法。具有讽刺意味的是,这是一个drawRect方法将为空的视图。

没有xib文件。

我需要做些什么来确保调用其他子视图中的drawRect方法?是否有文档描述了可能影响这一点的所有细微差别?

我正在努力设置NeedsDisplay。我认为它应该为调用它的视图和下面的层次结构触发drawRect调用,如果它在视图的范围内

不,事实并非如此。你是从哪里得到这个主意的?

-setNeedsDisplay:仅适用于它被发送到的视图。如果需要使其他视图无效,还需要添加一些代码来向它们发送-setNeedsDisplay:。这就是它的全部。

我认为这是对框架的优化;如果您的子视图不需要再次绘制,那么这是一个重大的性能改进。要意识到,几乎任何可设置动画的东西都不需要drawrrect(移动、缩放等)。

如果知道所有子视图都应该重新绘制(而不是简单地移动),那么在主视图中覆盖setNeedsDisplay并这样做:

-(void) setNeedsDisplay {
    [self.subviews makeObjectsPerformSelector:@selector(setNeedsDisplay)];
    [super setNeedsDisplay];
}

我已经测试过了,它会导致所有子视图也被重新绘制。请注意,如果你以某种方式过滤你的子视图,并确保你只将其发送到实际需要重新绘制的子视图,你将获得效率因果报应点数。。。如果你能弄清楚而不是如何需要重新绘制它们,那就更糟了。:-)

最新更新