102 lines
4.9 KiB
Swift
102 lines
4.9 KiB
Swift
//
|
|
// JSNavigationBarController.swift
|
|
// JSNavigationController
|
|
//
|
|
|
|
import AppKit
|
|
|
|
final class JSNavigationBarController: JSViewControllersStackManager {
|
|
var viewControllers: [NSViewController] = []
|
|
weak var contentView: NSView?
|
|
|
|
// MARK: - Initializers
|
|
public init(view: NSView?) {
|
|
contentView = view
|
|
}
|
|
|
|
// MARK: - Default animations
|
|
func defaultPushAnimation() -> AnimationBlock {
|
|
return { [weak self] (_, _) in
|
|
let containerViewBounds = self?.contentView?.bounds ?? .zero
|
|
|
|
let slideToLeftTransform = CATransform3DMakeTranslation(-containerViewBounds.width / 2, 0, 0)
|
|
let slideToLeftAnimation = CABasicAnimation(keyPath: #keyPath(CALayer.transform))
|
|
slideToLeftAnimation.fromValue = NSValue(caTransform3D: CATransform3DIdentity)
|
|
slideToLeftAnimation.toValue = NSValue(caTransform3D: slideToLeftTransform)
|
|
slideToLeftAnimation.duration = 0.25
|
|
slideToLeftAnimation.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.easeOut)
|
|
slideToLeftAnimation.fillMode = CAMediaTimingFillMode.forwards
|
|
slideToLeftAnimation.isRemovedOnCompletion = false
|
|
|
|
let slideFromRightTransform = CATransform3DMakeTranslation(containerViewBounds.width / 2, 0, 0)
|
|
let slideFromRightAnimation = CABasicAnimation(keyPath: #keyPath(CALayer.transform))
|
|
slideFromRightAnimation.fromValue = NSValue(caTransform3D: slideFromRightTransform)
|
|
slideFromRightAnimation.toValue = NSValue(caTransform3D: CATransform3DIdentity)
|
|
slideFromRightAnimation.duration = 0.25
|
|
slideFromRightAnimation.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.easeOut)
|
|
slideFromRightAnimation.fillMode = CAMediaTimingFillMode.forwards
|
|
slideFromRightAnimation.isRemovedOnCompletion = false
|
|
|
|
let fadeInAnimation = CABasicAnimation(keyPath: #keyPath(CALayer.opacity))
|
|
fadeInAnimation.fromValue = 0.0
|
|
fadeInAnimation.toValue = 1.0
|
|
fadeInAnimation.duration = 0.25
|
|
fadeInAnimation.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.easeOut)
|
|
fadeInAnimation.fillMode = CAMediaTimingFillMode.forwards
|
|
fadeInAnimation.isRemovedOnCompletion = false
|
|
|
|
let fadeOutAnimation = CABasicAnimation(keyPath: #keyPath(CALayer.opacity))
|
|
fadeOutAnimation.fromValue = 1.0
|
|
fadeOutAnimation.toValue = 0.0
|
|
fadeOutAnimation.duration = 0.25
|
|
fadeOutAnimation.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.easeOut)
|
|
fadeOutAnimation.fillMode = CAMediaTimingFillMode.forwards
|
|
fadeOutAnimation.isRemovedOnCompletion = false
|
|
|
|
return ([slideToLeftAnimation, fadeOutAnimation], [slideFromRightAnimation, fadeInAnimation])
|
|
}
|
|
}
|
|
|
|
func defaultPopAnimation() -> AnimationBlock {
|
|
return { [weak self] (_, _) in
|
|
let containerViewBounds = self?.contentView?.bounds ?? .zero
|
|
|
|
let slideToRightTransform = CATransform3DMakeTranslation(-containerViewBounds.width / 2, 0, 0)
|
|
let slideToRightAnimation = CABasicAnimation(keyPath: #keyPath(CALayer.transform))
|
|
slideToRightAnimation.fromValue = NSValue(caTransform3D: slideToRightTransform)
|
|
slideToRightAnimation.toValue = NSValue(caTransform3D: CATransform3DIdentity)
|
|
slideToRightAnimation.duration = 0.25
|
|
slideToRightAnimation.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.easeOut)
|
|
slideToRightAnimation.fillMode = CAMediaTimingFillMode.forwards
|
|
slideToRightAnimation.isRemovedOnCompletion = false
|
|
|
|
let slideToRightFromCenterTransform = CATransform3DMakeTranslation(containerViewBounds.width / 2, 0, 0)
|
|
let slideToRightFromCenterAnimation = CABasicAnimation(keyPath: #keyPath(CALayer.transform))
|
|
slideToRightFromCenterAnimation.fromValue = NSValue(caTransform3D: CATransform3DIdentity)
|
|
slideToRightFromCenterAnimation.toValue = NSValue(caTransform3D: slideToRightFromCenterTransform)
|
|
slideToRightFromCenterAnimation.duration = 0.35
|
|
slideToRightFromCenterAnimation.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.easeOut)
|
|
slideToRightFromCenterAnimation.fillMode = CAMediaTimingFillMode.forwards
|
|
slideToRightFromCenterAnimation.isRemovedOnCompletion = false
|
|
|
|
let fadeInAnimation = CABasicAnimation(keyPath: #keyPath(CALayer.opacity))
|
|
fadeInAnimation.fromValue = 0.0
|
|
fadeInAnimation.toValue = 1.0
|
|
fadeInAnimation.duration = 0.25
|
|
fadeInAnimation.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.easeOut)
|
|
fadeInAnimation.fillMode = CAMediaTimingFillMode.forwards
|
|
fadeInAnimation.isRemovedOnCompletion = false
|
|
|
|
let fadeOutAnimation = CABasicAnimation(keyPath: #keyPath(CALayer.opacity))
|
|
fadeOutAnimation.fromValue = 1.0
|
|
fadeOutAnimation.toValue = 0.0
|
|
fadeOutAnimation.duration = 0.25
|
|
fadeOutAnimation.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.easeOut)
|
|
fadeOutAnimation.fillMode = CAMediaTimingFillMode.forwards
|
|
fadeOutAnimation.isRemovedOnCompletion = false
|
|
|
|
return ([slideToRightFromCenterAnimation, fadeOutAnimation], [slideToRightAnimation, fadeInAnimation])
|
|
}
|
|
}
|
|
}
|