mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-06-15 21:45:19 +00:00
99 lines
4.2 KiB
Swift
99 lines
4.2 KiB
Swift
import Foundation
|
|
import UIKit
|
|
import AsyncDisplayKit
|
|
|
|
public enum ToolbarActionOption {
|
|
case left
|
|
case right
|
|
case middle
|
|
}
|
|
|
|
final class TabBarControllerNode: ASDisplayNode {
|
|
private var theme: TabBarControllerTheme
|
|
let tabBarNode: TabBarNode
|
|
private let navigationBar: NavigationBar?
|
|
private var toolbarNode: ToolbarNode?
|
|
private let toolbarActionSelected: (ToolbarActionOption) -> Void
|
|
|
|
var currentControllerNode: ASDisplayNode? {
|
|
didSet {
|
|
oldValue?.removeFromSupernode()
|
|
|
|
if let currentControllerNode = self.currentControllerNode {
|
|
self.insertSubnode(currentControllerNode, at: 0)
|
|
}
|
|
}
|
|
}
|
|
|
|
init(theme: TabBarControllerTheme, navigationBar: NavigationBar?, itemSelected: @escaping (Int, Bool, [ASDisplayNode]) -> Void, contextAction: @escaping (Int, ContextExtractedContentContainingNode, ContextGesture) -> Void, swipeAction: @escaping (Int, TabBarItemSwipeDirection) -> Void, toolbarActionSelected: @escaping (ToolbarActionOption) -> Void) {
|
|
self.theme = theme
|
|
self.navigationBar = navigationBar
|
|
self.tabBarNode = TabBarNode(theme: theme, itemSelected: itemSelected, contextAction: contextAction, swipeAction: swipeAction)
|
|
self.toolbarActionSelected = toolbarActionSelected
|
|
|
|
super.init()
|
|
|
|
self.setViewBlock({
|
|
return UITracingLayerView()
|
|
})
|
|
|
|
self.backgroundColor = theme.backgroundColor
|
|
|
|
self.addSubnode(self.tabBarNode)
|
|
}
|
|
|
|
func updateTheme(_ theme: TabBarControllerTheme) {
|
|
self.theme = theme
|
|
self.backgroundColor = theme.backgroundColor
|
|
|
|
self.tabBarNode.updateTheme(theme)
|
|
self.toolbarNode?.updateTheme(theme)
|
|
}
|
|
|
|
func containerLayoutUpdated(_ layout: ContainerViewLayout, toolbar: Toolbar?, transition: ContainedViewLayoutTransition) {
|
|
var tabBarHeight: CGFloat
|
|
var options: ContainerViewLayoutInsetOptions = []
|
|
if layout.metrics.widthClass == .regular {
|
|
options.insert(.input)
|
|
}
|
|
let bottomInset: CGFloat = layout.insets(options: options).bottom
|
|
if !layout.safeInsets.left.isZero {
|
|
tabBarHeight = 34.0 + bottomInset
|
|
} else {
|
|
tabBarHeight = 49.0 + bottomInset
|
|
}
|
|
|
|
let tabBarFrame = CGRect(origin: CGPoint(x: 0.0, y: layout.size.height - tabBarHeight), size: CGSize(width: layout.size.width, height: tabBarHeight))
|
|
|
|
transition.updateFrame(node: self.tabBarNode, frame: tabBarFrame)
|
|
self.tabBarNode.updateLayout(size: layout.size, leftInset: layout.safeInsets.left, rightInset: layout.safeInsets.right, bottomInset: bottomInset, transition: transition)
|
|
|
|
if let toolbar = toolbar {
|
|
if let toolbarNode = self.toolbarNode {
|
|
transition.updateFrame(node: toolbarNode, frame: tabBarFrame)
|
|
toolbarNode.updateLayout(size: tabBarFrame.size, leftInset: layout.safeInsets.left, rightInset: layout.safeInsets.right, bottomInset: bottomInset, toolbar: toolbar, transition: transition)
|
|
} else {
|
|
let toolbarNode = ToolbarNode(theme: self.theme, left: { [weak self] in
|
|
self?.toolbarActionSelected(.left)
|
|
}, right: { [weak self] in
|
|
self?.toolbarActionSelected(.right)
|
|
}, middle: { [weak self] in
|
|
self?.toolbarActionSelected(.middle)
|
|
})
|
|
toolbarNode.frame = tabBarFrame
|
|
toolbarNode.updateLayout(size: tabBarFrame.size, leftInset: layout.safeInsets.left, rightInset: layout.safeInsets.right, bottomInset: bottomInset, toolbar: toolbar, transition: .immediate)
|
|
self.addSubnode(toolbarNode)
|
|
self.toolbarNode = toolbarNode
|
|
if transition.isAnimated {
|
|
toolbarNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2)
|
|
}
|
|
}
|
|
} else if let toolbarNode = self.toolbarNode {
|
|
self.toolbarNode = nil
|
|
transition.updateAlpha(node: toolbarNode, alpha: 0.0, completion: { [weak toolbarNode] _ in
|
|
toolbarNode?.removeFromSupernode()
|
|
})
|
|
}
|
|
}
|
|
}
|