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 打破 UIView 的自动布局动画
使用 setNeedsDisplay 更新 UIView 不起作用