2013-03-12 72 views
1

我有一个UIView派生的视图,只绘制一次从未更新UIView setNeedsDisplay没有效果?

调用[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 
} 

什么,我已经尝试了小清单:

  • [自我setNeedsDisplay]
  • [self.layer setNeedsDisplay]
  • [self.mySubLayer setNeedsDisplay]
  • 自我。 contentMode = UIViewContentModeRedraw;
  • 手动创建,而不是从一个笔尖加载它(无效果)
  • 卸下使用层(子层和),并使用刚刚drawRect中(无效果)的图,
+1

你确定setNeedsDisplay被调用吗?显示该代码,设置一个断点,并指出它发生的位置,然后回报... – 2013-03-12 01:48:45

+1

要跟进Cubs的评论,你确定你在主线程上调用UIKit方法吗?如果你不这样做,可能会有一些古怪的后果,比如没有任何事情发生。 – 2013-03-12 01:56:59

+0

是的,我设置了断点。好点子。绝对肯定。花了几个小时在这个,阅读所有帖子,我可以找到并仔细检查一切。即使实例与由nib初始化并推入IBOutput(地址不变)的实例相同。有很多变量,所以我把所有的东西都转换成不使用CALayer,但这没什么区别,所以我把它放回去了。这对iOS框架来说很奇怪...... – StuWeldon 2013-03-12 02:00:19

回答

5

因此,这可以是标记为回答:一定要在主线程上调用UIKit方法。

+1

具体来说,使用这个:'[self performSelectorOnMainThread:@selector(setNeedsDisplay)withObject:self waitUntilDone:TRUE];' – StuWeldon 2013-03-12 02:29:08