我和setNeedsDisplay很纠结。我认为它应该触发对被调用的视图的drawRect:调用,如果它在视图的范围内,则触发该视图下的层次结构的调用,但我发现情况并非如此。下面是我的设置:
从应用程序委托中,我创建了一个大小为正方形的视图,该视图基本上覆盖了整个屏幕。这个视图被称为TrollCalendarView。除了指南针触发的旋转之外,TrollCalendarView没有发生太多事情。
TrollCalendarView有7个名为PlatformView的子视图,用于包含以7边排列围绕TrollCalendarView中心排列的二维绘图对象。因此,当iPad旋转时,这7个视图也会旋转,以便它们始终以基本方向为方向。
每个PlatformView子视图都包含3个名为Tower的子视图。每个塔都包含在drawRect:中实现的二维绘图对象。
因此,总而言之,我有带有空drawRect:的TrollCalendarView,以及每个都有drawRect实现的子视图PlatformView和Platformview ->塔。此外,塔位于平台的边界内,平台位于TrollCalendarView的边界内。
在TrollCalendarView中,我添加了一个刷卡识别器。当我刷卡的时候,一个属性被更新了,我调用了[self setNeedsDisplay],但是似乎什么都没有发生。我在每个视图的drawRect:方法中添加了NSLog条目,并且只调用TrollCalendarView drawRect:方法。具有讽刺意味的是,这是一个drawRect方法将为空的视图。
没有xib文件。
我需要做什么来确保其他子视图中的drawRect方法被调用?是否有文档描述了可能影响这一点的所有细微差别?
发布于 2012-07-14 12:26:03
我在和setNeedsDisplay作斗争。我认为它应该触发对被调用的视图的drawRect调用,如果它在视图的范围内,则会触发该视图下的层次结构
不,事实并非如此。你从哪里得到这个想法的?
-setNeedsDisplay:仅适用于它被发送到的视图。如果需要使其他视图无效,还需要添加一些代码来向它们发送-setNeedsDisplay:。非那样做不行。
发布于 2012-07-14 12:31:15
我认为这是框架中的优化;如果您的子视图不需要再次绘制,那么这是一个重大的性能改进。认识到几乎任何动画都不需要drawrect (移动、缩放等)。
如果您知道所有的子视图都应该重新绘制(而不是简单地移动),那么在您的主视图中覆盖setNeedsDisplay,并这样做:
-(void) setNeedsDisplay {
[self.subviews makeObjectsPerformSelector:@selector(setNeedsDisplay)];
[super setNeedsDisplay];
}我对此进行了测试,它会导致所有的子视图也被重新绘制。请注意,如果您以某种方式过滤您的子视图,并确保只将其发送到实际需要重新绘制的子视图,则您将获得效率因果点……如果你能找出不需要重新绘制它们的方法,那就更多了。:-)
https://stackoverflow.com/questions/11480341
复制相似问题