将UIColor与CAShapeLayer一起使用

时间:2017-07-03 14:15:14

标签: ios swift uicolor rgba cgcolor

我将RGB颜色传递给shapeLayer.fillColorshapeLayer.strokeColor,我的代码崩溃了。这就是我的尝试:

let shapeLayer = CAShapeLayer()
shapeLayer.fillColor = (UIColor(red: 57, green: 65, blue: 101, alpha: 1) as! CGColor)
shapeLayer.strokeColor = (UIColor(red: 57, green: 65, blue: 101, alpha: 1) as! CGColor)

如果我将RGB颜色写为:

UIColor(red: 57, green: 65, blue: 101, alpha: 1)

Xcode向我发出警告,将其更改为:

(UIColor(red: 57, green: 65, blue: 101, alpha: 1) as! CGColor)

error

当我运行Xcode的建议修复时,我的应用程序崩溃了。为什么呢?

3 个答案:

答案 0 :(得分:3)

首先,参数redgreenbluealpha的范围必须介于0.0到1.0之间

其次,您必须将cgColor传递给CGLayer,例如

let color = UIColor(red: 57.0/255.0, green: 65.0/255.0, blue: 101.0/255.0, alpha: 1)
shapeLayer.fillColor = color.cgColor
shapeLayer.strokeColor = color.cgColor

答案 1 :(得分:1)

您输入UIColor作为CGColor输入错误。 RGB值必须介于0.0到1.0之间,请检查以下代码。

let circlePath = UIBezierPath(arcCenter: CGPoint(x: bounds.origin.x+60,y: bounds.origin.y+107), radius: CGFloat(6), startAngle: CGFloat(0), endAngle:CGFloat(7), clockwise: true)

let shapeLayer = CAShapeLayer()
shapeLayer.path = circlePath.cgPath
circlePath.lineCapStyle = .round

let color = UIColor(red: 57.0/255.0, green: 65.0/255.0, blue: 101.0/255.0, alpha: 1).cgColor

shapeLayer.fillColor = color
shapeLayer.strokeColor = color
shapeLayer.lineWidth = 3.0
self.layer.addSublayer(shapeLayer)

答案 2 :(得分:1)

修复您的代码

你想要这样的东西:

let shapeLayer = CAShapeLayer()
shapeLayer.fillColor = UIColor(red: 57, green: 65, blue: 101, alpha: 1).cgColor
shapeLayer.strokeColor = UIColor(red: 57, green: 65, blue: 101, alpha: 1).cgColor

如何运作

关于继承的警告

Xcode警告您关于该作业的某些内容是正确的,因为您要将UIColor分配给CGColor属性,但是"修复-Me"建议是错误的。 (Xcode可能会这样做,因为它看到类名相似但不相同。可能值得提交雷达。)

您将看到很多这样的地方是将基本单元类的自定义UITableViewCell子类类型化,但这不会在这里工作。 CGColor不会继承UIColorUIColor也不会继承CGColor。 CGColor是CFTypeRef,UIColor继承自`NSObject。

其中一个不像其他

现在,为什么这些颜色不同?

CG代表"核心图形"并且位于比定义UIColor类的UIKit更低的级别。一个颜色对象是UIKit的一部分,也是Core Graphics的一部分。

文档说明UIColor是:

  

存储颜色数据的对象,有时是不透明度(alpha值)。"

再远一点,概述说UIColor在内部表示为预定颜色空间内的CGColor

另一方面,

CGColor是:

  

定义颜色的一组组件,颜色空间指定如何解释它们。"

从概念上讲,非常相似,但不完全相同。 UIColor在sRGBA空间(as noted here)中定义,但CGColor将包含有关其所在颜色空间的信息。

现在,您正在使用的动画层是Core Animation的一部分,Core Animation是另一个Apple框架。核心动画不是UIKit的一部分,它不是"而是#34; UIKit也是,所以它的课程不使用UIColor。核心动画使用CGColor表示颜色。

UIColor很容易实例化,而且我们大部分时间都在UIKit-land。我们如何在CALayerUIView s中工作时自定义UIViewController和朋友?幸运的是,UIColor使用CGColor属性公开了自己的.cgColor版本。

关于色彩空间的注意事项

其他一些答案请注意,您需要传递介于0.0和1.0之间的值。这是事实,但值得注意的是,从iOS 10开始,Apple已经为iOS增加了一些更广泛的色彩功能。

这意味着它实际上可以传递小于0.0且大于1.0的值。来自UIColor documentation

  

在扩展颜色空间中工作时,颜色值不会被限制以适应色域内,这意味着组件值可能小于0.0或大于1.0。当显示在sRGB显示屏上时,此类颜色位于色域之外,无法准确呈现。

您现在可能不需要担心色彩空间,但如果您想要在屏幕上显示颜色以外的其他事情,了解基础知识非常重要。 (生成反色或互补色是一些例子。)

Session 712 from WWDC 2016 (link)深入介绍了这个新API,我建议您在熟悉基础知识后再看一下它。

最后,有一个Apple Tech Note (TN2313)可以比我想象的更深入地讨论这个问题。如果你想在iOS macOS上学到很多关于颜色和颜色空间的知识,请阅读题为&#34; OS X和iOS中色彩管理的最佳实践的技术说明。&#34; < / p>