CALayer setNeedsDisplay无法正常工作?

时间:2012-12-04 13:36:43

标签: objective-c cocoa calayer nsnotificationcenter setneedsdisplay

我的类是CALayer子类,我通过NSNotificationCenter添加了一个观察者,在捕获消息时,它将运行如下函数:

- (void)setCurrentAutoValue:(NSNotification *) obj
{

     [self setNeedsDiaplay];
}

但这不起作用,有人可以帮忙吗?

4 个答案:

答案 0 :(得分:2)

显然,有必要在主线程上调用setNeedsDisplay。您可以使用performSelectorOnMainThread方法执行此操作。例如,在您的情况下:

[self performSelectorOnMainThread:@selector(setNeedsDisplay) withObject:0 waitUntilDone:NO];

答案 1 :(得分:0)

我有同样的问题通过另一个线程更新我的CALayers。如果我直接在同一个线程中调用以下任何一行,它就能完美地运行:

              [self setNeedsDisplay:YES];
              [self needsDisplay];
              [self.circleLayer needsDisplay];
              [self.circleLayer setNeedsDisplay];

但是当通过另一个线程调用这些时,没有任何变化。我玩了一下,结束了

              [self display];

这是迫使CALayers更新的唯一因素。 Self是一个NSOpenGLView,它包含多个图层和子图层。也许这可以帮助。每个CALayer都有相同的方法。也许你应该打电话给显示器。

答案 2 :(得分:0)

我的问题是我只能用动画更新CALayer,而不是通过设置它的内容(CGPath到属性“path”)。似乎唯一的解决方案是首先删除图层的所有动画,然后设置新路径:

[_myLayer removeAllAnimations];
UIBezierPath *newPath = ...
_myLayer.path = newPath.CGPath;

答案 3 :(得分:0)

自我注意:或者从未设置过CALayer的帧。每当CALayer出现问题时,首先确保其框架!= NSZeroRect。