Commit e69083a5 by Daniel Dahan

Updated transition logic for motionTransitionType when using Tabs and base TransitionController.

parent 5e8497db
......@@ -712,8 +712,8 @@
96D88BFD1C1328D800B91418 /* LICENSE */,
96D88BFC1C1328D800B91418 /* Info.plist */,
96D88C091C1328D800B91418 /* Material.h */,
9630ACB71F29A26B00B4217D /* Frameworks */,
96334EF51C8B84660083986B /* Assets.xcassets */,
9630ACB71F29A26B00B4217D /* Frameworks */,
96BCB7EC1CB40DE900C806FE /* Font */,
96BCB7571CB40DC500C806FE /* iOS */,
);
......
Subproject commit b9a2576453296a86582ed43aad357456e76a7924
Subproject commit 83ab6b006233162b0fc49602e2e2754a3949ebac
......@@ -272,7 +272,7 @@ extension CALayer {
return
}
cornerRadius = bounds.size.width / 2
cornerRadius = frame.size.width / 2
}
/// Sets the shadow path.
......
......@@ -176,16 +176,34 @@ internal extension NavigationBar {
}
item.toolbar.backgroundColor = .clear
item.titleView = item.toolbar
guard let v = item.titleView as? Toolbar else {
return
}
removeConstraints(constraints)
if #available(iOS 11.0, *) {
let h = CGFloat(heightPreset.rawValue)
frame = CGRect(x: frame.origin.x, y: 20, width: frame.size.width, height: h)
for subview in subviews {
var stringFromClass = NSStringFromClass(subview.classForCoder)
if stringFromClass.contains("BarBackground") {
subview.frame = CGRect(x: 0, y: 0, width: frame.width, height: h)
}
stringFromClass = NSStringFromClass(subview.classForCoder)
if stringFromClass.contains("BarContent") {
subview.frame = CGRect(x: subview.frame.origin.x, y: 0, width: subview.frame.width, height: h)
}
}
v.frame = frame
} else {
v.frame = bounds
}
v.contentEdgeInsets = contentEdgeInsets
v.interimSpace = interimSpace
v.frame = bounds
}
}
......@@ -120,6 +120,7 @@ open class NavigationController: UINavigationController {
*/
open func prepare() {
isMotionEnabled = true
navigationBar.frame.size.width = view.bounds.width
navigationBar.heightPreset = .normal
view.clipsToBounds = true
......@@ -135,6 +136,7 @@ open class NavigationController: UINavigationController {
/// Calls the layout functions for the view heirarchy.
open func layoutSubviews() {
navigationBar.setNeedsUpdateConstraints()
navigationBar.updateConstraints()
navigationBar.setNeedsLayout()
navigationBar.layoutIfNeeded()
......
......@@ -75,7 +75,7 @@ public protocol TabsControllerDelegate {
*/
@objc
optional func tabsController(tabsController: TabsController, shouldSelect viewController: UIViewController) -> Bool
/**
A delegation method that is executed when the view controller will transitioned to.
- Parameter tabsController: A TabsController.
......@@ -83,7 +83,7 @@ public protocol TabsControllerDelegate {
*/
@objc
optional func tabsController(tabsController: TabsController, willSelect viewController: UIViewController)
/**
A delegation method that is executed when the view controller has been transitioned to.
- Parameter tabsController: A TabsController.
......@@ -104,36 +104,36 @@ open class TabsController: TransitionController {
layoutSubviews()
}
}
/// The TabBar used to switch between view controllers.
@IBInspectable
open let tabBar = TabBar()
/// A delegation reference.
open weak var delegate: TabsControllerDelegate?
/// An Array of UIViewControllers.
open var viewControllers: [UIViewController] {
didSet {
selectedIndex = 0
prepareSelectedIndexViewController()
prepareTabBar()
layoutSubviews()
}
}
/// A reference to the currently selected view controller index value.
@IBInspectable
open fileprivate(set) var selectedIndex = 0
/// The tabBar alignment.
open var tabBarAlignment = TabBarAlignment.bottom {
didSet {
layoutSubviews()
}
}
/**
An initializer that initializes the object with a NSCoder object.
- Parameter aDecoder: A NSCoder instance.
......@@ -142,7 +142,7 @@ open class TabsController: TransitionController {
viewControllers = []
super.init(coder: aDecoder)
}
/**
An initializer that accepts an Array of UIViewControllers.
- Parameter viewControllers: An Array of UIViewControllers.
......@@ -152,34 +152,34 @@ open class TabsController: TransitionController {
self.selectedIndex = selectedIndex
super.init(nibName: nil, bundle: nil)
}
fileprivate override init(rootViewController: UIViewController) {
self.viewControllers = []
super.init(rootViewController: rootViewController)
}
open override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
layoutSubviews()
}
open override func layoutSubviews() {
super.layoutSubviews()
layoutTabBar()
layoutContainer()
layoutRootViewController()
}
open override func prepare() {
super.prepare()
view.backgroundColor = .white
view.contentScaleFactor = Screen.scale
prepareTabBar()
prepareTabItems()
prepareSelectedIndexViewController()
}
open override func transition(to viewController: UIViewController, completion: ((Bool) -> Void)?) {
transition(to: viewController, isTriggeredByUserInteraction: false, completion: completion)
}
......@@ -196,33 +196,30 @@ fileprivate extension TabsController {
guard let fvcIndex = viewControllers.index(of: rootViewController) else {
return
}
guard let tvcIndex = viewControllers.index(of: viewController) else {
return
}
var isAuto = false
switch viewController.motionModalTransitionType {
switch motionTransitionType {
case .auto:
isAuto = true
viewController.motionModalTransitionType = fvcIndex < tvcIndex ? .slide(direction: .left) : .slide(direction: .right)
switch viewController.motionTransitionType {
case .auto:
Motion.shared.setAnimationForNextTransition(fvcIndex < tvcIndex ? .slide(direction: .left) : .slide(direction: .right))
default:break
}
default:break
}
if isTriggeredByUserInteraction {
delegate?.tabsController?(tabsController: self, willSelect: viewController)
}
super.transition(to: viewController) { [weak self, isAuto = isAuto, viewController = viewController, completion = completion] (isFinished) in
super.transition(to: viewController) { [weak self, viewController = viewController, completion = completion] (isFinished) in
guard let s = self else {
return
}
if isAuto {
viewController.motionModalTransitionType = .auto
}
completion?(isFinished)
if isTriggeredByUserInteraction {
......@@ -237,7 +234,7 @@ fileprivate extension TabsController {
func prepareSelectedIndexViewController() {
rootViewController = viewControllers[selectedIndex]
}
/// Prepares the TabBar.
func prepareTabBar() {
tabBar.lineAlignment = .bottom == tabBarAlignment ? .top : .bottom
......@@ -245,11 +242,11 @@ fileprivate extension TabsController {
tabBar.delegate = self
view.addSubview(tabBar)
}
/// Prepares the `tabBar.tabItems`.
func prepareTabItems() {
var tabItems = [TabItem]()
for v in viewControllers {
// Expectation that viewDidLoad() triggers update of tab item title:
if #available(iOS 9.0, *) {
......@@ -259,7 +256,7 @@ fileprivate extension TabsController {
}
tabItems.append(v.tabItem)
}
tabBar.tabItems = tabItems
tabBar.selectedTabItem = tabItems[selectedIndex]
}
......@@ -272,30 +269,31 @@ fileprivate extension TabsController {
case .partial:
let p = tabBar.bounds.height
let y = view.bounds.height - p
switch tabBarAlignment {
case .top:
container.frame.origin.y = p
container.frame.size.height = y
case .bottom:
container.frame.origin.y = 0
container.frame.size.height = y
}
container.frame.size.width = view.bounds.width
case .full:
container.frame = view.bounds
}
}
/// Layout the tabBar.
func layoutTabBar() {
tabBar.frame.origin.x = 0
tabBar.frame.origin.y = .top == tabBarAlignment ? 0 : view.bounds.height - tabBar.bounds.height
tabBar.frame.size.width = view.bounds.width
}
/// Layout the rootViewController.
func layoutRootViewController() {
rootViewController.view.frame = container.bounds
......@@ -311,19 +309,19 @@ extension TabsController {
guard index != selectedIndex else {
return
}
Motion.async { [weak self] in
guard let s = self else {
return
}
s.tabBar.select(at: index)
s.transition(to: s.viewControllers[index], isTriggeredByUserInteraction: false) { [weak self] (isFinished) in
guard isFinished else {
return
}
self?.selectedIndex = index
}
}
......@@ -336,24 +334,24 @@ extension TabsController: _TabBarDelegate {
guard !(false == tabBar.delegate?.tabBar?(tabBar: tabBar, shouldSelect: tabItem)) else {
return
}
guard let i = tabBar.tabItems.index(of: tabItem) else {
return
}
guard i != selectedIndex else {
return
}
guard !(false == delegate?.tabsController?(tabsController: self, shouldSelect: viewControllers[i])) else {
return
}
transition(to: viewControllers[i], isTriggeredByUserInteraction: true) { [weak self] (isFinished) in
guard isFinished else {
return
}
self?.selectedIndex = i
}
}
......
......@@ -148,6 +148,16 @@ open class TransitionController: UIViewController {
open func transition(to viewController: UIViewController, completion: ((Bool) -> Void)? = nil) {
prepare(viewController: viewController, in: container)
switch motionTransitionType {
case .auto:break
default:
switch viewController.motionTransitionType {
case .auto:
viewController.motionTransitionType = motionTransitionType
default:break
}
}
view.isUserInteractionEnabled = false
Motion.shared.transition(from: rootViewController, to: viewController, in: container) { [weak self, viewController = viewController, completion = completion] (isFinished) in
guard let s = self else {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment