7

我正在苦苦挣扎setNeedsDisplay。我认为它应该触发对它被调用drawRect:的视图的调用,如果它在视图的范围内,那么它下面的层次结构,但我发现情况并非如此。这是我的设置:

从应用程序委托中,我创建了一个大小为正方形的视图,基本上覆盖了整个屏幕空间。这种观点称为TrollCalendarViewTrollCalendarView除了由指南针触发的旋转之外,没有什么事情发生。

有 7 个TrollCalendarView被调用的子视图,PlatformView旨在包含 2D 绘图对象,这些对象TrollCalendarView以 7 面排列的中心排列。因此,当 iPad 旋转时,这 7 个视图会旋转,因此它们始终与基本方向一致。

每个PlatformView子视图包含 3 个子视图,称为Tower. 每个塔都包含在drawRect:.

所以,总而言之,我有TrollCalendarViewempty drawRect:、 subviewsPlatformViewPlatformview-> Tower ,每个都有 drawRect 实现。此外,Tower 位于 Platform 的范围内,Platform 位于 TrollCalendarView 的范围内。

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

没有xib文件。

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

4

2 回答 2

9

我正在为 setNeedsDisplay 苦苦挣扎。我认为它应该为调用它的视图触发 drawRect 调用,如果它在视图的范围内,则它下面的层次结构

不,事实并非如此。你从哪里得到这个想法的?

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

于 2012-07-14T04:26:02.510 回答
5

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

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

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

我已经对此进行了测试,它也会导致所有子视图都被重绘。请注意,如果您以某种方式过滤子视图并确保仅将其发送到实际需要重绘的子视图,您将获得效率业力点......如果您能弄清楚如何不需要重绘它们,甚至更多。:-)

于 2012-07-14T04:31:14.897 回答