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:,子视图PlatformView和Platformview- >塔,每个都有drawRect实现.此外,Tower位于Platform的范围内,而Platform位于TrollCalendarView的范围内.
在TrollCalendarView我添加了一个滑动识别器.当我滑动发生时,属性被更新,我打电话[self setNeedsDisplay]但似乎没有任何事情发生.我drawRect:在每个视图中添加了NSLog条目到方法,并且只TrollCalendarView drawRect:调用了该方法.具有讽刺意味的是,这是一个视图,其drawRect方法将为空.
没有xib文件.
我需要做些什么来确保drawRect调用其他子视图中的方法?是否有某些文档描述了可能影响这一点的所有细微差别?
我正在努力使用setNeedsDisplay.我认为它应该触发drawRect调用它被调用的视图和下面的层次结构,如果它在视图的范围内
不,事实并非如此.你在哪里得到这个想法?
-setNeedsDisplay:仅适用于发送它的视图.如果您需要使其他视图无效,则还需要添加一些代码以发送-setNeedsDisplay:给它们.这里的所有都是它的.
我认为这是框架中的优化; 如果你的子视图并不需要重新绘制,那么这是一个重大的性能提升.意识到几乎任何动画都不需要画画(移动,缩放等).
如果您知道所有子视图都应该重新绘制(而不是简单地移动),那么在主视图中覆盖setNeedsDisplay并执行以下操作:
-(void) setNeedsDisplay {
[self.subviews makeObjectsPerformSelector:@selector(setNeedsDisplay)];
[super setNeedsDisplay];
}
Run Code Online (Sandbox Code Playgroud)
我测试过这个,它也会重新绘制所有子视图.请注意,您将获得效率的荣誉点数,如果你以某种方式筛选子视图,并确保您只发送到子视图实际需要重绘 ......甚至更多,如果你能弄清楚如何并不需要重绘他们.:-)