Commit c3245ef5 by Daniel Dahan Committed by GitHub

Merge pull request #848 from seubseub/master

Add tabs natural slide option
parents 3c78808f 6e8dcb6e
...@@ -90,6 +90,18 @@ open class TabsController: TransitionController { ...@@ -90,6 +90,18 @@ open class TabsController: TransitionController {
} }
} }
fileprivate var _isAllDirectionSlideEnable: Bool = false
/// user can slide views left, right naturally.
open var isAllDirectionSlideEnabled: Bool {
get {
return _isAllDirectionSlideEnable
}
set(newVal) {
_isAllDirectionSlideEnable = newVal
}
}
/// A reference to the currently selected view controller index value. /// A reference to the currently selected view controller index value.
@IBInspectable @IBInspectable
open fileprivate(set) var selectedIndex = 0 open fileprivate(set) var selectedIndex = 0
...@@ -274,6 +286,15 @@ extension TabsController: TabBarDelegate { ...@@ -274,6 +286,15 @@ extension TabsController: TabBarDelegate {
return return
} }
if(_isAllDirectionSlideEnable) {
tabsTransition(tabsController: self, to: viewControllers[i], completion: { [weak self] (isFinished) in
guard isFinished else {
return
}
self?.selectedIndex = i
})
} else {
transition(to: viewControllers[i]) { [weak self] (isFinished) in transition(to: viewControllers[i]) { [weak self] (isFinished) in
guard isFinished else { guard isFinished else {
return return
...@@ -282,4 +303,5 @@ extension TabsController: TabBarDelegate { ...@@ -282,4 +303,5 @@ extension TabsController: TabBarDelegate {
self?.selectedIndex = i self?.selectedIndex = i
} }
} }
}
} }
...@@ -128,6 +128,60 @@ open class TransitionController: UIViewController { ...@@ -128,6 +128,60 @@ open class TransitionController: UIViewController {
} }
/** /**
A method to swap rootViewController objects specially in tabsController.
- Parameter tabsController: indicate tabsController. if tabsController nil then default transition method will be executed.
- Parameter toViewController: The UIViewController to swap
with the active rootViewController.
- Parameter completion: A completion block that is execited after
the transition animation from the active rootViewController
to the toViewController has completed.
*/
open func tabsTransition(tabsController: TabsController?, to viewController: UIViewController, completion: ((Bool) -> Void)? = nil) {
guard let fvc = rootViewController else {
return
}
let tvc = viewController
tvc.view.isHidden = false
tvc.view.frame = container.bounds
if(tabsController == nil) {
tvc.motionModalTransitionType = motionTransitionType
view.isUserInteractionEnabled = false
Motion.shared.transition(from: fvc, to: tvc, in: container) { [weak self, tvc = tvc, completion = completion] (isFinished) in
guard let s = self else {
return
}
s.rootViewController = tvc
s.view.isUserInteractionEnabled = true
completion?(isFinished)
}
}
let fvcIndex = tabsController?.viewControllers.index(of: fvc)
let tvcIndex = tabsController?.viewControllers.index(of: viewController)
if(fvcIndex! < tvcIndex!) {
tvc.motionModalTransitionType = .slide(direction: .left)
} else {
tvc.motionModalTransitionType = .slide(direction: .right)
}
view.isUserInteractionEnabled = false
Motion.shared.transition(from: fvc, to: tvc, in: container) { [weak self, tvc = tvc, completion = completion] (isFinished) in
guard let s = self else {
return
}
s.rootViewController = tvc
s.view.isUserInteractionEnabled = true
completion?(isFinished)
}
}
/**
To execute in the order of the layout chain, override this To execute in the order of the layout chain, override this
method. `layoutSubviews` should be called immediately, unless you method. `layoutSubviews` should be called immediately, unless you
have a certain need. have a certain need.
......
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