Commit 29433f6b by Daniel Dahan

TabsController fixes, added delegation, and programmatical selection of view controller

parent 4411f585
Pod::Spec.new do |s| Pod::Spec.new do |s|
s.name = 'Material' s.name = 'Material'
s.version = '2.10.0' s.version = '2.10.1'
s.license = 'BSD-3-Clause' s.license = 'BSD-3-Clause'
s.summary = 'A Material Design library for creating beautiful applications.' s.summary = 'A Material Design library for creating beautiful applications.'
s.homepage = 'http://materialswift.com' s.homepage = 'http://materialswift.com'
......
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
<key>CFBundlePackageType</key> <key>CFBundlePackageType</key>
<string>FMWK</string> <string>FMWK</string>
<key>CFBundleShortVersionString</key> <key>CFBundleShortVersionString</key>
<string>2.10.0</string> <string>2.10.1</string>
<key>CFBundleSignature</key> <key>CFBundleSignature</key>
<string>????</string> <string>????</string>
<key>CFBundleVersion</key> <key>CFBundleVersion</key>
......
...@@ -498,7 +498,7 @@ extension Switch { ...@@ -498,7 +498,7 @@ extension Switch {
extension Switch { extension Switch {
/** /**
Handle the TouchUpOutside and TouchCancel events. Handle the TouchUpOutside and TouchCancel moments.
- Parameter sender: A UIButton. - Parameter sender: A UIButton.
- Parameter event: A UIEvent. - Parameter event: A UIEvent.
*/ */
......
...@@ -46,20 +46,23 @@ public enum TabBarLineAlignment: Int { ...@@ -46,20 +46,23 @@ public enum TabBarLineAlignment: Int {
@objc(TabBarDelegate) @objc(TabBarDelegate)
public protocol TabBarDelegate { public protocol TabBarDelegate {
/** /**
A delegation method that is executed when the tabItem will trigger the A delegation method that is executed to determine if the TabBar should
animation to the next tab. transition to the next tab.
- Parameter tabBar: A TabBar. - Parameter tabBar: A TabBar.
- Parameter tabItem: A TabItem. - Parameter tabItem: A TabItem.
- Returns: A Boolean.
*/ */
@objc @objc
optional func tabBar(tabBar: TabBar, willSelect tabItem: TabItem) optional func tabBar(tabBar: TabBar, shouldSelect tabItem: TabItem) -> Bool
/** /**
A delegation method that is executed to determine if the tabItem should A delegation method that is executed when the tabItem will trigger the
transition to the next tab. animation to the next tab.
- Parameter tabBar: A TabBar.
- Parameter tabItem: A TabItem.
*/ */
@objc @objc
optional func tabBar(tabBar: TabBar, shouldSelect tabItem: TabItem) -> Bool optional func tabBar(tabBar: TabBar, willSelect tabItem: TabItem)
/** /**
A delegation method that is executed when the tabItem did complete the A delegation method that is executed when the tabItem did complete the
...@@ -123,7 +126,7 @@ open class TabBar: Bar { ...@@ -123,7 +126,7 @@ open class TabBar: Bar {
open weak var delegate: TabBarDelegate? open weak var delegate: TabBarDelegate?
/// The currently selected tabItem. /// The currently selected tabItem.
open fileprivate(set) var selectedTabItem: TabItem? open internal(set) var selectedTabItem: TabItem?
/// A preset wrapper around tabItems contentEdgeInsets. /// A preset wrapper around tabItems contentEdgeInsets.
open var tabItemsContentEdgeInsetsPreset: EdgeInsetsPreset { open var tabItemsContentEdgeInsetsPreset: EdgeInsetsPreset {
......
...@@ -63,6 +63,35 @@ extension UIViewController { ...@@ -63,6 +63,35 @@ extension UIViewController {
} }
} }
@objc(TabsControllerDelegate)
public protocol TabsControllerDelegate {
/**
A delegation method that is executed to determine if the TabsController should
transition to the next view controller.
- Parameter tabBar: A TabsController.
- Parameter tabItem: A TabItem.
- Returns: A Boolean.
*/
@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.
- Parameter viewController: A UIViewController.
*/
@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.
- Parameter viewController: A UIViewController.
*/
@objc
optional func tabsController(tabsController: TabsController, didSelect viewController: UIViewController)
}
open class TabsController: TransitionController { open class TabsController: TransitionController {
/** /**
A Display value to indicate whether or not to A Display value to indicate whether or not to
...@@ -79,6 +108,9 @@ open class TabsController: TransitionController { ...@@ -79,6 +108,9 @@ open class TabsController: TransitionController {
@IBInspectable @IBInspectable
open let tabBar = TabBar() open let tabBar = TabBar()
/// A delegation reference.
open weak var delegate: TabsControllerDelegate?
/// An Array of UIViewControllers. /// An Array of UIViewControllers.
open var viewControllers: [UIViewController] { open var viewControllers: [UIViewController] {
didSet { didSet {
...@@ -153,6 +185,18 @@ open class TabsController: TransitionController { ...@@ -153,6 +185,18 @@ open class TabsController: TransitionController {
} }
open override func transition(to viewController: UIViewController, completion: ((Bool) -> Void)?) { open override func transition(to viewController: UIViewController, completion: ((Bool) -> Void)?) {
transition(to: viewController, isTriggeredByUserInteraction: false, completion: completion)
}
}
fileprivate extension TabsController {
/**
Transitions to the given view controller.
- Parameter to viewController: A UIViewController.
- Parameter isTriggeredByUserInteraction: A Boolean.
- Parameter completion: An optional completion block.
*/
func transition(to viewController: UIViewController, isTriggeredByUserInteraction: Bool, completion: ((Bool) -> Void)?) {
guard let fvc = rootViewController else { guard let fvc = rootViewController else {
return return
} }
...@@ -173,6 +217,10 @@ open class TabsController: TransitionController { ...@@ -173,6 +217,10 @@ open class TabsController: TransitionController {
default:break default:break
} }
if isTriggeredByUserInteraction {
delegate?.tabsController?(tabsController: self, willSelect: tvc)
}
view.isUserInteractionEnabled = false view.isUserInteractionEnabled = false
Motion.shared.transition(from: fvc, to: tvc, in: container) { [weak self, tvc = tvc, isAuto = isAuto, completion = completion] (isFinished) in Motion.shared.transition(from: fvc, to: tvc, in: container) { [weak self, tvc = tvc, isAuto = isAuto, completion = completion] (isFinished) in
guard let s = self else { guard let s = self else {
...@@ -185,7 +233,12 @@ open class TabsController: TransitionController { ...@@ -185,7 +233,12 @@ open class TabsController: TransitionController {
s.rootViewController = tvc s.rootViewController = tvc
s.view.isUserInteractionEnabled = true s.view.isUserInteractionEnabled = true
completion?(isFinished) completion?(isFinished)
if isTriggeredByUserInteraction {
s.delegate?.tabsController?(tabsController: s, didSelect: tvc)
}
} }
} }
} }
...@@ -244,6 +297,7 @@ fileprivate extension TabsController { ...@@ -244,6 +297,7 @@ fileprivate extension TabsController {
} }
tabBar.tabItems = tabItems tabBar.tabItems = tabItems
tabBar.selectedTabItem = tabItems[selectedIndex]
} }
} }
...@@ -296,6 +350,34 @@ fileprivate extension TabsController { ...@@ -296,6 +350,34 @@ fileprivate extension TabsController {
} }
} }
extension TabsController {
/**
Transitions to the view controller that is at the given index.
- Parameter at index: An Int.
*/
open func select(at index: Int) {
guard index != selectedIndex else {
return
}
Motion.delay(0) { [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
}
}
}
}
extension TabsController: TabBarDelegate { extension TabsController: TabBarDelegate {
@objc @objc
open func tabBar(tabBar: TabBar, willSelect tabItem: TabItem) { open func tabBar(tabBar: TabBar, willSelect tabItem: TabItem) {
...@@ -311,7 +393,11 @@ extension TabsController: TabBarDelegate { ...@@ -311,7 +393,11 @@ extension TabsController: TabBarDelegate {
return return
} }
transition(to: viewControllers[i]) { [weak self] (isFinished) in guard !(false == delegate?.tabsController?(tabsController: self, shouldSelect: viewControllers[i])) else {
return
}
transition(to: viewControllers[i], isTriggeredByUserInteraction: true) { [weak self] (isFinished) in
guard isFinished else { guard isFinished else {
return return
} }
......
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