首先是问题:我如何(在iOS中)使用不同的混合模式从图像创建多个图层,并独立地为图像设置动画(而不是渲染结果)。
我完全坚持这一点。我想绘制一些图像并为它们制作一点动画。只是一些旋转和缩放。图像图层应使用混合模式,如“颜色”和“颜色”。或者' SoftLight'。
这是我到目前为止所尝试的内容:
绘制所有内容并使用CADisplayLink创建动画循环。结果是非常糟糕的性能,但它看起来很棒:)这里的一些代码只是为了展示我如何使用混合模式:
override public func draw(_ rect: CGRect) {
super.draw(rect)
let layer0 = UIImage(named:"ellipse_00")!
layer0.draw(in: rect, blendMode: .screen, alpha: 0.5)
let layer1 = UIImage(named:"ellipse_01")!
layer1.draw(in: rect, blendMode: .softLight, alpha: 1)
...
只要有一个渲染循环调用' setNeedsDisplay()'表现不见了。即使没有在更新方法中更改图像的位置。
使用CALayers动画效果很好,但iOS 10中似乎不支持过滤器,compositeFilter和backgroundFilter :(
ellipse_00 = UIView(frame: self.bounds)
ellipse_00.layer.backgroundColor = UIColor.black.cgColor
ellipse_00.isOpaque = false
ellipse_00.layer.contents = UIImage(named: "ellipse_00")!.cgImage!
ellipse_00.layer.opacity = 1
let filter = CIFilter(name: "CIScreenBlendMode")
ellipse_00.layer.compositingFilter = filter
self.addSubview(ellipse_00)
我可以弄清楚如何正确地绘制这些东西,但是尝试动画会导致随机崩溃和很多挫折。
private override func setupUI() {
super.setupUI()
background_image = GPUImagePicture(cgImage: UIImage(named: "black")?.cgImage)
ellipse_00_image = GPUImagePicture(cgImage: UIImage(named: "ellipse_00")?.cgImage)
// Define Filters
softLightFilter = GPUImageSoftLightBlendFilter()
// Define Filter Chain
softLightFilter.addTarget(gpuImageView)
// Process Images
background_image?.addTarget(softLightFilter)
ellipse_00_image?.addTarget(softLightFilter)
}
override func updateUI() {
super.updateUI()
// Change position and rotate…
background_image?.processImage()
ellipse_00_image?.processImage()
}