import Foundation import UIKit import AsyncDisplayKit final class PeekControllerMenuNode: ASDisplayNode { private let itemNodes: [PeekControllerMenuItemNode] init(theme: PeekControllerTheme, items: [PeekControllerMenuItem], activatedAction: @escaping () -> Void) { self.itemNodes = items.map { PeekControllerMenuItemNode(theme: theme, item: $0, activatedAction: activatedAction) } super.init() self.backgroundColor = theme.menuBackgroundColor self.cornerRadius = 16.0 self.clipsToBounds = true for itemNode in self.itemNodes { self.addSubnode(itemNode) } } func updateLayout(width: CGFloat, transition: ContainedViewLayoutTransition) -> CGFloat { var verticalOffset: CGFloat = 0.0 for itemNode in self.itemNodes { let itemHeight = itemNode.updateLayout(width: width, transition: transition) transition.updateFrame(node: itemNode, frame: CGRect(origin: CGPoint(x: 0.0, y: verticalOffset), size: CGSize(width: width, height: itemHeight))) verticalOffset += itemHeight } return verticalOffset - UIScreenPixel } }