setNeedsDisplay不会按预期触发子视图中的drawRect

Vic*_*gel 6 objective-c subview drawrect setneedsdisplay

我正在努力setNeedsDisplay.我认为它应该触发调用drawRect:它的视图的调用和下面的层次结构,如果它在视图的范围内,但我不会发现它是这种情况.这是我的设置:

从应用程序委托中,我创建了一个视图,其大小是一个正方形,基本上覆盖整个屏幕的空间.这个观点叫做TrollCalendarView.TrollCalendarView除了由指南针触发的旋转之外,没有太多事情发生.

有7个TrollCalendarView被调用的子视图PlatformView旨在包含TrollCalendarView以7边排列围绕中心排列的2D绘图对象.因此,当iPad旋转时,这7个视图旋转,使得它们始终以基本方向定向.

每个PlatformView子视图都包含3个子视图Tower.每个塔包含实现的2D绘图对象drawRect:.

所以,总而言之,我TrollCalendarView有空的drawRect:,子视图PlatformViewPlatformview- >塔,每个都有drawRect实现.此外,Tower位于Platform的范围内,而Platform位于TrollCalendarView的范围内.

TrollCalendarView我添加了一个滑动识别器.当我滑动发生时,属性被更新,我打电话[self setNeedsDisplay]但似乎没有任何事情发生.我drawRect:在每个视图中添加了NSLog条目到方法,并且只TrollCalendarView drawRect:调用了该方法.具有讽刺意味的是,这是一个视图,其drawRect方法将为空.

没有xib文件.

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

Kur*_*vis 8

我正在努力使用setNeedsDisplay.我认为它应该触发drawRect调用它被调用的视图和下面的层次结构,如果它在视图的范围内

不,事实并非如此.你在哪里得到这个想法?

-setNeedsDisplay:仅适用于发送它的视图.如果您需要使其他视图无效,则还需要添加一些代码以发送-setNeedsDisplay:给它们.这里的所有都是它的.


Chr*_*hey 5

我认为这是框架中的优化; 如果你的子视图并不需要重新绘制,那么这是一个重大的性能提升.意识到几乎任何动画都不需要画画(移动,缩放等).

如果您知道所有子视图都应该重新绘制(而不是简单地移动),那么在主视图中覆盖setNeedsDisplay并执行以下操作:

-(void) setNeedsDisplay {
    [self.subviews makeObjectsPerformSelector:@selector(setNeedsDisplay)];
    [super setNeedsDisplay];
}
Run Code Online (Sandbox Code Playgroud)

我测试过这个,它也会重新绘制所有子视图.请注意,您将获得效率的荣誉点数,如果你以某种方式筛选子视图,并确保您只发送到子视图实际需要重绘 ......甚至更多,如果你能弄清楚如何并不需要重绘他们.:-)