import Foundation import UIKit import AsyncDisplayKit open class ListViewAccessoryItemNode: ASDisplayNode { var transitionOffset: CGPoint = CGPoint() { didSet { self.bounds = CGRect(origin: self.transitionOffset, size: self.bounds.size) } } private var transitionOffsetAnimation: ListViewAnimation? final func animateTransitionOffset(_ from: CGPoint, beginAt: Double, duration: Double, curve: @escaping (CGFloat) -> CGFloat) { self.transitionOffset = from self.transitionOffsetAnimation = ListViewAnimation(from: from, to: CGPoint(), duration: duration, curve: curve, beginAt: beginAt, update: { [weak self] _, currentValue in if let strongSelf = self { strongSelf.transitionOffset = currentValue } }) } final func removeAllAnimations() { self.transitionOffsetAnimation = nil self.transitionOffset = CGPoint() } final func animate(_ timestamp: Double) -> Bool { if let animation = self.transitionOffsetAnimation { animation.applyAt(timestamp) if animation.completeAt(timestamp) { self.transitionOffsetAnimation = nil } else { return true } } return false } override open func layout() { super.layout() self.updateLayout(size: self.bounds.size, leftInset: 0.0, rightInset: 0.0) } open func updateLayout(size: CGSize, leftInset: CGFloat, rightInset: CGFloat) { } }