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

标签: ios uiview drawing


【解决方案1】:

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

【讨论】:

  • 具体来说,使用这个:[self performSelectorOnMainThread:@selector(setNeedsDisplay) withObject:self waitUntilDone:TRUE];
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-13
  • 2019-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多