UIView setNeedsDisplay 没有效果?

Posted

技术标签:

【中文标题】UIView setNeedsDisplay 没有效果?【英文标题】:UIView setNeedsDisplay Has No Effect? 【发布时间】: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 线程绘制,但您至少可以通知它们应该绘制。相反,框架只是决定忽略该请求? 酷,很高兴这有效。当我粗心时,同样的问题已经咬了我好几次。老实说,我宁愿程序只是崩溃而不是什么都不做。 【参考方案1】:

所以这可以标记为已回答:一定要在主线程上调用 UIKit 方法。

【讨论】:

具体来说,使用这个:[self performSelectorOnMainThread:@selector(setNeedsDisplay) withObject:self waitUntilDone:TRUE];

以上是关于UIView setNeedsDisplay 没有效果?的主要内容,如果未能解决你的问题,请参考以下文章

iOS UIView常用的一些方法setNeedsDisplay和setNeedsLayout 区别

尝试使用 setNeedsDisplay()

setNeedsDisplay 打破 UIView 的自动布局动画

使用 setNeedsDisplay 更新 UIView 不起作用

重新加载/刷新子视图 - setNeedsDisplay 不起作用

uiview 子类在第一次调用 setneedsdisplay 时显示为黑色矩形,但在那之后就可以了