【发布时间】:2013-03-12 01:45:06
【问题描述】:
我有一个 UIView 派生的视图,它只绘制一次并且从未更新。
调用[self setNeedsDisplay] 无效。这是什么原因造成的?
绘图代码有没有在无所谓
-
drawRect:,或 -
drawLayer:inContext:(定义了一个空的 drawRect())
如果 drawLayer:inContext 没有定义,那么 drawRect 被调用。但只有一次(在布局期间)。
- (void)drawLayer:(CALayer*)layer inContext:(CGContextRef)ctx {
// drawing occurs, but just once (during view layout)
}
`- (void)drawRect:(CGRect) rect {
// empty -- never called
}
我尝试过的小清单:
- [自设需求显示]
- [self.layer setNeedsDisplay]
- [self.mySubLayer setNeedsDisplay]
- self.contentMode = UIViewContentModeRedraw;
- 手动创建视图,而不是从 .nib 加载它(无效)
- 删除层(和子层)的使用,只使用 drawRect(无效)
【问题讨论】:
-
你确定 setNeedsDisplay 被调用了吗?显示该代码,在您期望它发生的位置设置断点,然后返回报告...
-
跟进 Cubs 的评论,您确定要在主线程上调用 UIKit 方法吗?如果你不这样做,那可能会产生一些古怪的后果,比如什么都不会发生。
-
是的,我设置了断点。好点子。绝对确定。花了几个小时,阅读我能找到的所有帖子并仔细检查所有内容。甚至该实例与由 nib 初始化并推入 IBOutput 的实例相同(地址不变)。有很多变量,所以我将所有内容都转换为不使用 CALayer,但这没有任何区别,所以我把它放回去了。 iOS 框架有点奇怪……
-
@darren:就是这样!我从非 UI 线程的回调中调用 setNeedsDisplay。如果您将此添加为答案,我会将其标记为答案。多么奇怪的要求!大多数 UI 框架不允许从非 UI 线程绘制,但您至少可以通知它们应该绘制。相反,框架只是决定忽略该请求?
-
酷,很高兴这有效。当我粗心时,同样的问题已经咬了我好几次。老实说,我宁愿程序只是崩溃而不是什么都不做。