我将RGB颜色传递给shapeLayer.fillColor
和shapeLayer.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)
当我运行Xcode的建议修复时,我的应用程序崩溃了。为什么呢?
答案 0 :(得分:3)
首先,参数red
,green
,blue
和alpha
的范围必须介于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
不会继承UIColor
,UIColor
也不会继承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。我们如何在CALayer
和UIView
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>