如何解决在 Swift 5.0 中对 SKSpriteNode 应用渐变效果
iOS 14,Swift 5.x
尝试使用 SKEffect 向 spriteNode 添加渐变。代码编译,但随后崩溃,我是否在这里尝试了不可能的事情。
let image2U = UIImage(named: "2140983")?.ciImage
let effectsNode = SKEffectNode()
let filter = CIFilter(name: "CILinearGradient")
let startColor = UIColor.red
let endColor = UIColor.yellow
let startVector = CIVector(cgPoint: CGPoint(x: 0,y: 0))
let endVector = CIVector(cgPoint: CGPoint(x: Box.size.width,y: Box.size.height))
filter?.setDefaults()
filter?.setValue(startVector,forKey: "inputPoint0")
filter?.setValue(endVector,forKey: "inputPoint1")
filter?.setValue(startColor,forKey: "inputColor0")
filter?.setValue(endColor,forKey: "inputColor1")
filter?.setValue(image2U,forKey: "inputimage")
effectsNode.filter = filter
self.addChild(effectsNode)
effectsNode.addChild(Box)
编译,但随后崩溃并显示此消息...
2021-07-09 21:08:47.584142+0200 GameIV[19791:1140737] *** Terminating app due to uncaught exception 'NSUnkNownKeyException',reason: '[<CILinearGradient 0x600002070d20> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key Inputimage.'
如你所见,我添加了一个 inputimage?试了一个 UIImage,同样的错误...根本没有试过任何图像,同样的错误?
解决方法
可能是您的密钥名称有误。也许 "inputImage"
而不是 "InputImage"
。通常你会使用其中一个常量来避免这些。 https://developer.apple.com/documentation/coreimage/cifilter/filter_parameter_keys
我的问题的答案是 SKEffectNodes 需要一个输入图像,这就是它在这里试图告诉我的。梯度过滤器不需要/处理图像,它只是创建一个新图像。这是用于执行此操作的 CIFilter 代码。
extension UIImage {
func returnCheckerboard() -> UIImage {
let context = CIContext(options: nil)
let checkerFilter = CIFilter.checkerboardGenerator()
checkerFilter.color0 = .white
checkerFilter.color1 = .black
checkerFilter.center = CGPoint(x: 0,y: 0)
checkerFilter.sharpness = 1
checkerFilter.width = 8
guard let outputImage = checkerFilter.outputImage else { return UIImage() }
if let cgimg = context.createCGImage(outputImage,from: CGRect(x: 0,y: 0,width: 128,height: 128)) {
let filteredImage = UIImage(cgImage: cgimg)
return filteredImage
}
return UIImage()
}
}
这不会创建渐变,但原理是一样的。它创建了一个棋盘,不需要输入图像,并且不能/不是可以与 SKEffectNode 一起使用的 CIFilter。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。