59 lines
1.5 KiB
Swift
59 lines
1.5 KiB
Swift
//
|
|
// ShapeLayerContainer.swift
|
|
// lottie-swift
|
|
//
|
|
// Created by Brandon Withrow on 1/22/19.
|
|
//
|
|
|
|
import CoreGraphics
|
|
import Foundation
|
|
|
|
/// A CompositionLayer responsible for initializing and rendering shapes
|
|
final class ShapeCompositionLayer: CompositionLayer {
|
|
|
|
// MARK: Lifecycle
|
|
|
|
init(shapeLayer: ShapeLayerModel) {
|
|
let results = shapeLayer.items.initializeNodeTree()
|
|
let renderContainer = ShapeContainerLayer()
|
|
self.renderContainer = renderContainer
|
|
rootNode = results.rootNode
|
|
super.init(layer: shapeLayer, size: .zero)
|
|
contentsLayer.addSublayer(renderContainer)
|
|
for container in results.renderContainers {
|
|
renderContainer.insertRenderLayer(container)
|
|
}
|
|
rootNode?.updateTree(0, forceUpdates: true)
|
|
childKeypaths.append(contentsOf: results.childrenNodes)
|
|
}
|
|
|
|
override init(layer: Any) {
|
|
guard let layer = layer as? ShapeCompositionLayer else {
|
|
fatalError("init(layer:) wrong class.")
|
|
}
|
|
rootNode = nil
|
|
renderContainer = nil
|
|
super.init(layer: layer)
|
|
}
|
|
|
|
required init?(coder _: NSCoder) {
|
|
fatalError("init(coder:) has not been implemented")
|
|
}
|
|
|
|
// MARK: Internal
|
|
|
|
let rootNode: AnimatorNode?
|
|
let renderContainer: ShapeContainerLayer?
|
|
|
|
override func displayContentsWithFrame(frame: CGFloat, forceUpdates: Bool) {
|
|
rootNode?.updateTree(frame, forceUpdates: forceUpdates)
|
|
renderContainer?.markRenderUpdates(forFrame: frame)
|
|
}
|
|
|
|
override func updateRenderScale() {
|
|
super.updateRenderScale()
|
|
renderContainer?.renderScale = renderScale
|
|
}
|
|
|
|
}
|