我有一个 View Controller (MagmaViewController
),它管理一个名为 MagmaView
的 View 。对于 MagmaView
的直接支持层,我通过将以下内容放入 MagmaView
的实现部分来分配我自己的自定义 CALayer 子类 MagmaLayer
:
+ (Class)layerClass
{
return [MagmaLayer class];
}
我有一些自定义绘图,我希望 MagmaLayer
为 MagmaView
绘制,所以我将一些绘图代码放入 -(void) drawInContext:(CGContextRef )
方法。问题是,当我这样做并运行模拟器时,MagmaView 显示为空白。我在 MagmaLayer
的上下文MagmaLayer
的 -(void) drawInContext:(CGContextRef) context
方法中设置了一个断点,看起来这个方法根本没有被调用。
显然,我对用于触发此 CALayer 绘制的 setNeedsDisplay
命令的需求和位置感到困惑。首先,我认为,至少对于 CALayer 的第一次初始出现,如果 CALayer 是 UIView 的直接支持层,则不需要发出 setNeedsDisplay
命令,并且任何 UIView 都确保它的直接支持层在需要时被正确绘制,只有非直接 CALayer 支持层需要特别注意以确保它们自己绘制。不是这样吗?另外,我应该在哪里放置 setNeedsDisplay
命令来使这个直接支持层 MagmaLayer
自行绘制? setNeedsDisplay
命令是否应该在 MagmaView
的初始化方法中,这里是托管 MagmaLayer
的 View ?或者我应该在链上走得更远,将 setNeedsDisplay
命令放在 MagmaViewController
中,管理 MagmaView
的 View Controller 在 Controller 的viewWillAppear
方法?
最佳答案
您需要告诉您的自定义图层何时绘制。基本实现不会自动调用 -(void) drawInContext:(CGContextRef) context
。基本设置是在图层初始化方法中设置 needsDisplayOnBoundsChange = YES
。
如果您有应触发重绘的自定义属性,则必须实现/扩展 + (BOOL)needsDisplayForKey:(NSString *)key
。
关于ios - 在哪里调用 setNeedsDisplay 来更新 CALayer?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30959691/