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