我有一个 View Controller ( MagmaViewController ),它正在管理一个名为 MagmaView 的 View 。对于 MagmaView 的直接支持层,我通过将以下内容放入 MagmaLayer 的实现部分,分配了我自己的自定义 CALayer 子类,称为 MagmaView :

+ (Class)layerClass
{
    return [MagmaLayer class];
}

我有一些自定义绘图,我希望 MagmaLayerMagmaView 绘制,所以我将一些绘图代码放入 -(void) drawInContext:(CGContextRef) contextMagmaLayer 方法中。问题是,当我这样做并运行模拟器时,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/

10-12 14:31