我有一个视图控制器(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
方法
答案 0 :(得分:2)
您需要告诉自定义图层何时绘制。基本实现不会自动调用-(void) drawInContext:(CGContextRef) context
。基本设置是在层init方法中设置needsDisplayOnBoundsChange = YES
。
如果您有自定义属性应触发重绘,则必须实现/扩展+ (BOOL)needsDisplayForKey:(NSString *)key
。