为啥在使用 CAGradientLayer 时应用会崩溃

Posted

技术标签:

【中文标题】为啥在使用 CAGradientLayer 时应用会崩溃【英文标题】:Why does the app crash when using CAGradientLayer为什么在使用 CAGradientLayer 时应用会崩溃 【发布时间】:2012-03-29 21:32:07 【问题描述】:

我已开始使用 CAGradientLayer,但我的应用崩溃了

CAGradientLayer *gradient = [CAGradientLayer layer];
gradient.frame = headerView.bounds;
gradient.colors = [NSArray arrayWithObjects:(id)[UIColor redColor],(id)[UIColor greenColor], nil];

[headerView.layer addSublayer:gradient];

EXEC_BAD_ACCESS

我的实现是否有错误?

【问题讨论】:

【参考方案1】:

这是一个小错误 - 您需要使用 CGColorRef 指针数组:

gradient.colors = [NSArray arrayWithObjects:(id)[[UIColor redColor] CGColor], (id)[[UIColor greenColor] CGColor], nil];

【讨论】:

非常感谢,编译时没有验证有什么原因吗? 这是个好问题——Objective-C 使用动态运行时,所以在创建数组时,编译器并不真正关心数组中的什么。当我们使用动态运行时,我们会丢失这些类型的编译时完整性检查,但这是值得的 :)【参考方案2】:

CAGradientLayer 使用 CGColorRef 值。使用 UIColor 的 CGColor 属性。示例:

[UIColor redColor].CGColor

【讨论】:

以上是关于为啥在使用 CAGradientLayer 时应用会崩溃的主要内容,如果未能解决你的问题,请参考以下文章

为啥我无法使用 CAGradientLayer 的掩码

为啥我不能在 ARC 中使用自定义颜色创建 CAGradientLayer?

为啥在模态视图控制器被解除后 CAGradientLayer 从视图中删除

为啥我的 CAGradientLayer 没有显示?

如何在 iOS swift 运行时更新 CAGradientLayer 颜色?

使用编程约束时如何将 CAGradientLayer 添加到 UIView