在哪里调用setNeedsDisplay以更新CALayer?

时间:2015-06-20 23:02:14

标签: ios objective-c uiview calayer

我有一个视图控制器(MagmaViewController),它正在管理名为MagmaView的视图。对于MagmaView的直接后备层,我已将{@ 1}}的实现部分中的以下内容分配给我自己的自定义CALayer子类MagmaLayer

MagmaView

我有一些我希望+ (Class)layerClass { return [MagmaLayer class]; } MagmaLayer绘制的自定义绘图,因此我将一些绘图代码放入MagmaView的{​​{1}}方法中。问题是,当我这样做并运行模拟器时,MagmaView显示为空白。我在-(void) drawInContext:(CGContextRef) context MagmaLayer方法中设置了一个断点,看起来根本没有调用此方法。

显然,我对MagmaLayer命令触发绘制此CALayer的需要和位置感到困惑。首先,我认为,至少对于CALayer的第一次初始出现,如果CALayer是UIView的直接后备层,则不需要发出-(void) drawInContext:(CGContextRef) context命令,并且任何UIView确保其直接在需要时适当地绘制背衬层,并且只有非直接的CALayer背衬层需要特别注意以确保它们自己绘制。这不是这样吗?此外,我应该在哪里放置setNeedsDisplay命令以使此直接后备层setNeedsDisplay绘制自己? setNeedsDisplay命令是否应该在MagmaLayer的初始化方法中,这是托管setNeedsDisplay的视图?或者我应该进一步向上推进并将MagmaView命令放在MagmaLayer中,管理setNeedsDisplay的视图控制器,比如控制器的MagmaViewController方法

1 个答案:

答案 0 :(得分:2)

您需要告诉自定义图层何时绘制。基本实现不会自动调用-(void) drawInContext:(CGContextRef) context。基本设置是在层init方法中设置needsDisplayOnBoundsChange = YES。 如果您有自定义属性应触发重绘,则必须实现/扩展+ (BOOL)needsDisplayForKey:(NSString *)key