Swiftgram/submodules/Display/Display/NavigationBarTransitionContainer.swift
Peter 8f5a4f7dc1 Add 'submodules/Display/' from commit '7bd11013ea936e3d49d937550d599f5816d32560'
git-subtree-dir: submodules/Display
git-subtree-mainline: 9bc996374ffdad37aef175427db72731c9551dcf
git-subtree-split: 7bd11013ea936e3d49d937550d599f5816d32560
2019-06-11 18:44:37 +01:00

70 lines
2.2 KiB
Swift

import Foundation
import UIKit
import AsyncDisplayKit
class NavigationBarTransitionContainer: ASDisplayNode {
var progress: CGFloat = 0.0 {
didSet {
self.layout()
}
}
let transition: NavigationTransition
let topNavigationBar: NavigationBar
let bottomNavigationBar: NavigationBar
let topClippingNode: ASDisplayNode
let bottomClippingNode: ASDisplayNode
let topNavigationBarSupernode: ASDisplayNode?
let bottomNavigationBarSupernode: ASDisplayNode?
init(transition: NavigationTransition, topNavigationBar: NavigationBar, bottomNavigationBar: NavigationBar) {
self.transition = transition
self.topNavigationBar = topNavigationBar
self.topNavigationBarSupernode = topNavigationBar.supernode
self.bottomNavigationBar = bottomNavigationBar
self.bottomNavigationBarSupernode = bottomNavigationBar.supernode
self.topClippingNode = ASDisplayNode()
self.topClippingNode.clipsToBounds = true
self.bottomClippingNode = ASDisplayNode()
self.bottomClippingNode.clipsToBounds = true
super.init()
self.topClippingNode.addSubnode(self.topNavigationBar)
self.bottomClippingNode.addSubnode(self.bottomNavigationBar)
self.addSubnode(self.bottomClippingNode)
self.addSubnode(self.topClippingNode)
}
func complete() {
self.topNavigationBarSupernode?.addSubnode(self.topNavigationBar)
self.bottomNavigationBarSupernode?.addSubnode(self.bottomNavigationBar)
}
override func layout() {
super.layout()
let size = self.bounds.size
let position: CGFloat
switch self.transition {
case .Push:
position = 1.0 - progress
case .Pop:
position = progress
}
let offset = floorToScreenPixels(size.width * position)
self.topClippingNode.frame = CGRect(origin: CGPoint(x: offset, y: 0.0), size: size)
self.bottomClippingNode.frame = CGRect(origin: CGPoint(x: 0.0, y: 0.0), size: CGSize(width: offset, height: size.height))
}
}