ios - 在哪里调用 setNeedsDisplay 来更新 CALayer?

标签 ios objective-c uiview calayer

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

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

我有一些自定义绘图,我希望 MagmaLayerMagmaView 绘制,所以我将一些绘图代码放入 -(void) drawInContext:(CGContextRef ) MagmaLayer 的上下文 方法。问题是,当我这样做并运行模拟器时,MagmaView 显示为空白。我在 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/

相关文章:

objective-c - iPhone 中的图像处理

ios - 具有 UIWebView 或自定义 View Controller 的 iPad 应用程序

ios - 当 UIView 高度设置为零时, View 的子控件不隐藏

iphone - UIScrollView 将触摸发送到 subview

ios - 如何绘制 UIBezierPath 并与之交互

iphone - 如何在 UITextField 退出第一响应者后更改 UIScrollView contentSize

ios - SKLabelNode 根据文本长度设置字体大小

objective-c - 滚动表时向核心数据发出获取请求

objective-c - 我们可以将 NSString 与 NSMutableString 进行比较吗

ios - 布局 View 位于另一个以编程方式创建的 View 下方