我的类是一个CALayer
子类,我通过添加了一个观察者NSNotificationCenter
,当捕捉到消息时,它将运行如下函数:
- (void)setCurrentAutoValue:(NSNotification *) obj
{
[self setNeedsDiaplay];
}
但这不起作用,有人可以帮忙吗?
我的类是一个CALayer
子类,我通过添加了一个观察者NSNotificationCenter
,当捕捉到消息时,它将运行如下函数:
- (void)setCurrentAutoValue:(NSNotification *) obj
{
[self setNeedsDiaplay];
}
但这不起作用,有人可以帮忙吗?
显然,有必要在主线程上调用 setNeedsDisplay。您可以使用该performSelectorOnMainThread
方法执行此操作。例如在你的情况下:
[self performSelectorOnMainThread:@selector(setNeedsDisplay) withObject:0 waitUntilDone:NO];
我通过另一个线程更新我的 CALayers 时遇到了同样的问题。如果我直接在同一个线程中调用以下任何行,它就会完美地工作:
[self setNeedsDisplay:YES];
[self needsDisplay];
[self.circleLayer needsDisplay];
[self.circleLayer setNeedsDisplay];
但是当通过另一个线程调用这些时,没有任何变化。我玩了一会儿,最后使用了
[self display];
这是唯一迫使 CALayers 更新的事情。Self 是一个 NSOpenGLView ,它包含几个层和子层。也许这会有所帮助。每个 CALayer 都有相同的可用方法。也许你应该调用显示。
我的问题是我只能用动画更新 CALayer,而不是通过设置它的内容(属性“路径”的 CGPath)。似乎唯一的解决方案是首先删除图层的所有动画,然后设置新路径:
[_myLayer removeAllAnimations];
UIBezierPath *newPath = ...
_myLayer.path = newPath.CGPath;
自我注意:或者从未设置过 CALayer 的框架。每当 CALayer 出现问题时,首先要确保它的框架!= NSZeroRect。