我正在与setNeedsDisplay
作斗争。我认为它应该为调用它的视图和下面的层次结构触发对drawRect:
的调用,如果它在视图的边界内,但我发现事实并非如此。这是我的设置:
在应用程序代理中,我创建了一个视图,其大小是一个正方形,基本上覆盖了整个屏幕的实际区域。此视图称为TrollCalendarView
。除了指南针触发的旋转之外,TrollCalendarView
没有发生太多事情。
TrollCalendarView
有7个子视图,称为PlatformView
,旨在包含以7边排列方式围绕TrollCalendarView
的中心排列的2D绘制对象。因此,当iPad旋转时,这7个视图会旋转,使它们始终与基本方向一致。
每个CCD_ 8子视图包含3个子视图,称为CCD_。每个塔包含在drawRect:
中实现的二维绘制对象。
因此,总的来说,我有空drawRect:
的TrollCalendarView
,以及分别具有drawRect实现的子视图PlatformView
和Platformview
->Tower。此外,Tower位于Platform的边界内,Platform位于TrollCalendarView的边界内。
在TrollCalendarView
中,我添加了一个滑动识别器。当我滑动时,会更新一个属性,并调用[self setNeedsDisplay]
,但似乎什么都没发生。我在每个视图中都向drawRect:
方法添加了NSLog条目,并且只调用了TrollCalendarView
drawRect:
方法。具有讽刺意味的是,这是一个drawRect
方法将为空的视图。
没有xib文件。
我需要做些什么来确保调用其他子视图中的drawRect
方法?是否有文档描述了可能影响这一点的所有细微差别?
我正在努力设置NeedsDisplay。我认为它应该为调用它的视图和下面的层次结构触发drawRect调用,如果它在视图的范围内
不,事实并非如此。你是从哪里得到这个主意的?
-setNeedsDisplay:
仅适用于它被发送到的视图。如果需要使其他视图无效,还需要添加一些代码来向它们发送-setNeedsDisplay:
。这就是它的全部。
我认为这是对框架的优化;如果您的子视图不需要再次绘制,那么这是一个重大的性能改进。要意识到,几乎任何可设置动画的东西都不需要drawrrect(移动、缩放等)。
如果知道所有子视图都应该重新绘制(而不是简单地移动),那么在主视图中覆盖setNeedsDisplay并这样做:
-(void) setNeedsDisplay {
[self.subviews makeObjectsPerformSelector:@selector(setNeedsDisplay)];
[super setNeedsDisplay];
}
我已经测试过了,它会导致所有子视图也被重新绘制。请注意,如果你以某种方式过滤你的子视图,并确保你只将其发送到实际需要重新绘制的子视图,你将获得效率因果报应点数。。。如果你能弄清楚而不是如何需要重新绘制它们,那就更糟了。:-)