首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >setNeedsDisplay未按预期在子视图中触发drawRect

setNeedsDisplay未按预期在子视图中触发drawRect
EN

Stack Overflow用户
提问于 2012-07-14 09:41:54
回答 2查看 5.2K关注 0票数 7

我和setNeedsDisplay很纠结。我认为它应该触发对被调用的视图的drawRect:调用,如果它在视图的范围内,则触发该视图下的层次结构的调用,但我发现情况并非如此。下面是我的设置:

从应用程序委托中,我创建了一个大小为正方形的视图,该视图基本上覆盖了整个屏幕。这个视图被称为TrollCalendarView。除了指南针触发的旋转之外,TrollCalendarView没有发生太多事情。

TrollCalendarView有7个名为PlatformView的子视图,用于包含以7边排列围绕TrollCalendarView中心排列的二维绘图对象。因此,当iPad旋转时,这7个视图也会旋转,以便它们始终以基本方向为方向。

每个PlatformView子视图都包含3个名为Tower的子视图。每个塔都包含在drawRect:中实现的二维绘图对象。

因此,总而言之,我有带有空drawRect:TrollCalendarView,以及每个都有drawRect实现的子视图PlatformViewPlatformview ->塔。此外,塔位于平台的边界内,平台位于TrollCalendarView的边界内。

TrollCalendarView中,我添加了一个刷卡识别器。当我刷卡的时候,一个属性被更新了,我调用了[self setNeedsDisplay],但是似乎什么都没有发生。我在每个视图的drawRect:方法中添加了NSLog条目,并且只调用TrollCalendarView drawRect:方法。具有讽刺意味的是,这是一个drawRect方法将为空的视图。

没有xib文件。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-14 12:26:03

我在和setNeedsDisplay作斗争。我认为它应该触发对被调用的视图的drawRect调用,如果它在视图的范围内,则会触发该视图下的层次结构

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

-setNeedsDisplay:仅适用于它被发送到的视图。如果需要使其他视图无效,还需要添加一些代码来向它们发送-setNeedsDisplay:。非那样做不行。

票数 9
EN

Stack Overflow用户

发布于 2012-07-14 12:31:15

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

如果您知道所有的子视图都应该重新绘制(而不是简单地移动),那么在您的主视图中覆盖setNeedsDisplay,并这样做:

代码语言:javascript
运行
复制
-(void) setNeedsDisplay {
    [self.subviews makeObjectsPerformSelector:@selector(setNeedsDisplay)];
    [super setNeedsDisplay];
}

我对此进行了测试,它会导致所有的子视图也被重新绘制。请注意,如果您以某种方式过滤您的子视图,并确保只将其发送到实际需要重新绘制的子视图,则您将获得效率因果点……如果你能找出不需要重新绘制它们的方法,那就更多了。:-)

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11480341

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档