我的类是CALayer
子类,我通过NSNotificationCenter
添加了一个观察者,在捕获消息时,它将运行如下函数:
- (void)setCurrentAutoValue:(NSNotification *) obj
{
[self setNeedsDiaplay];
}
但这不起作用,有人可以帮忙吗?
答案 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。