Commit bf177342 by Daniel Dahan

development: updated PageController to PageTabBarController and updated transition animations

parent 821a17ac
......@@ -16,7 +16,7 @@
96334EF61C8B84660083986B /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 96334EF51C8B84660083986B /* Assets.xcassets */; };
963832421B88DFD80015F710 /* Material.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 963832361B88DFD80015F710 /* Material.framework */; };
963FBEFD1D669510008F8512 /* Snackbar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 963FBEFC1D669510008F8512 /* Snackbar.swift */; };
963FBF081D669D14008F8512 /* PageController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 963FBF071D669D14008F8512 /* PageController.swift */; };
963FBF081D669D14008F8512 /* PageTabBarController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 963FBF071D669D14008F8512 /* PageTabBarController.swift */; };
9658F2171CD6FA4700B902C1 /* IconButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9658F2161CD6FA4700B902C1 /* IconButton.swift */; };
9660161D1CB2ED6C00AAB661 /* Material.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 966016131CB2ED6C00AAB661 /* Material.framework */; };
9660162A1CB2F04E00AAB661 /* Material.h in Headers */ = {isa = PBXBuildFile; fileRef = 96D88C091C1328D800B91418 /* Material.h */; settings = {ATTRIBUTES = (Public, ); }; };
......@@ -209,7 +209,7 @@
963832411B88DFD80015F710 /* Material.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Material.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
963832591B88E31A0015F710 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
963FBEFC1D669510008F8512 /* Snackbar.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Snackbar.swift; sourceTree = "<group>"; };
963FBF071D669D14008F8512 /* PageController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PageController.swift; sourceTree = "<group>"; };
963FBF071D669D14008F8512 /* PageTabBarController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PageTabBarController.swift; sourceTree = "<group>"; };
9658F2161CD6FA4700B902C1 /* IconButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = IconButton.swift; sourceTree = "<group>"; };
966016131CB2ED6C00AAB661 /* Material.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Material.framework; sourceTree = BUILT_PRODUCTS_DIR; };
9660161C1CB2ED6C00AAB661 /* Material macOS Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Material macOS Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
......@@ -360,7 +360,7 @@
962DDD071D6FBBB7001C307C /* Page */ = {
isa = PBXGroup;
children = (
963FBF071D669D14008F8512 /* PageController.swift */,
963FBF071D669D14008F8512 /* PageTabBarController.swift */,
);
name = Page;
sourceTree = "<group>";
......@@ -1073,7 +1073,7 @@
962864621D54111D00690B69 /* JSON.swift in Sources */,
96BCB7C21CB40DC500C806FE /* Device.swift in Sources */,
96BCB7A41CB40DC500C806FE /* CaptureSession.swift in Sources */,
963FBF081D669D14008F8512 /* PageController.swift in Sources */,
963FBF081D669D14008F8512 /* PageTabBarController.swift in Sources */,
963FBEFD1D669510008F8512 /* Snackbar.swift in Sources */,
96BCB7C51CB40DC500C806FE /* MaterialGravity.swift in Sources */,
968C99471D377849000074FF /* Offset.swift in Sources */,
......
......@@ -34,12 +34,19 @@ import UIKit
private var PageTabBarItemKey: UInt8 = 0
open class PageTabBarItem: FlatButton {
override open func prepareView() {
open override func prepareView() {
super.prepareView()
pulseAnimation = .none
}
}
open class PageTabBar: TabBar {
open override func prepareView() {
super.prepareView()
isLineAnimated = false
}
}
/// Grid extension for UIView.
extension UIViewController {
/// Grid reference.
......@@ -57,15 +64,15 @@ extension UIViewController {
extension UIViewController {
/**
A convenience property that provides access to the PageController.
This is the recommended method of accessing the PageController
A convenience property that provides access to the PageTabBarController.
This is the recommended method of accessing the PageTabBarController
through child UIViewControllers.
*/
public var pageController: PageController? {
public var pageTabBarController: PageTabBarController? {
var viewController: UIViewController? = self
while nil != viewController {
if viewController is PageController {
return viewController as? PageController
if viewController is PageTabBarController {
return viewController as? PageTabBarController
}
viewController = viewController?.parent
}
......@@ -73,21 +80,21 @@ extension UIViewController {
}
}
@objc(PageControllerDelegate)
public protocol PageControllerDelegate {
@objc(PageTabBarControllerDelegate)
public protocol PageTabBarControllerDelegate {
}
@objc(PageController)
open class PageController: RootController {
@objc(PageTabBarController)
open class PageTabBarController: RootController {
/// The currently selected UIViewController.
open internal(set) var selectedIndex: Int = 0
/// Reference to the TabBar.
open internal(set) var tabBar: TabBar!
/// Reference to the PageTabBar.
open internal(set) var pageTabBar: PageTabBar!
/// Delegation handler.
public weak var delegate: PageControllerDelegate?
public weak var delegate: PageTabBarControllerDelegate?
/// A reference to the instance when it is a UIPageViewController.
open var pageViewController: UIPageViewController? {
......@@ -104,14 +111,14 @@ open class PageController: RootController {
public override init(rootViewController: UIViewController) {
super.init(rootViewController: UIPageViewController(transitionStyle: .scroll, navigationOrientation: .horizontal, options: nil))
viewControllers.append(rootViewController)
setViewControllers(viewControllers, direction: .forward, animated: true, completion: nil)
setViewControllers(viewControllers, direction: .forward, animated: true)
}
public init(viewControllers: [UIViewController], selectedIndex: Int, direction: UIPageViewControllerNavigationDirection, animated: Bool) {
super.init(rootViewController: UIPageViewController(transitionStyle: .scroll, navigationOrientation: .horizontal, options: nil))
self.selectedIndex = selectedIndex
self.viewControllers.append(contentsOf: viewControllers)
setViewControllers([self.viewControllers[selectedIndex]], direction: direction, animated: animated, completion: nil)
setViewControllers([self.viewControllers[selectedIndex]], direction: direction, animated: animated)
}
/**
......@@ -121,7 +128,7 @@ open class PageController: RootController {
*/
open override func layoutSubviews() {
super.layoutSubviews()
guard let v = tabBar else {
guard let v = pageTabBar else {
return
}
......@@ -149,7 +156,7 @@ open class PageController: RootController {
*/
open override func prepareView() {
super.prepareView()
prepareTabBar()
preparePageTabBar()
}
override func prepareRootViewController() {
......@@ -172,31 +179,59 @@ open class PageController: RootController {
/// Prepares the pageTabBarItems.
open func preparePageTabBarItems() {
tabBar.buttons.removeAll()
pageTabBar.buttons.removeAll()
for x in viewControllers {
tabBar.buttons.append(x.pageTabBarItem as UIButton)
let button = x.pageTabBarItem as UIButton
pageTabBar.buttons.append(button)
button.removeTarget(self, action: #selector(pageTabBar.handleButton(button:)), for: .touchUpInside)
button.removeTarget(self, action: #selector(handlePageTabBarButton(button:)), for: .touchUpInside)
button.addTarget(self, action: #selector(handlePageTabBarButton(button:)), for: .touchUpInside)
}
}
/**
Handles the pageTabBarButton.
- Parameter button: A UIButton.
*/
@objc
internal func handlePageTabBarButton(button: UIButton) {
guard let index = pageTabBar.buttons.index(of: button) else {
return
}
guard index != selectedIndex else {
return
}
setViewControllers([viewControllers[index]], direction: index < selectedIndex ? .reverse : .forward, animated: true) { [weak self, index = index] _ in
guard let s = self else {
return
}
s.selectedIndex = index
s.pageTabBar.select(at: index)
}
}
/// Prepares the tabBar.
private func prepareTabBar() {
if nil == tabBar {
tabBar = TabBar()
tabBar.zPosition = 1000
view.addSubview(tabBar)
tabBar.select(at: selectedIndex)
/// Prepares the pageTabBar.
private func preparePageTabBar() {
if nil == pageTabBar {
pageTabBar = PageTabBar()
pageTabBar.zPosition = 1000
view.addSubview(pageTabBar)
pageTabBar.select(at: selectedIndex)
}
}
}
extension PageController {
extension PageTabBarController {
open func setViewControllers(_ viewControllers: [UIViewController]?, direction: UIPageViewControllerNavigationDirection, animated: Bool, completion: (@escaping (Bool) -> Void)? = nil) {
pageViewController?.setViewControllers(viewControllers, direction: direction, animated: animated, completion: completion)
preparePageTabBarItems()
}
}
extension PageController: UIPageViewControllerDelegate {
extension PageTabBarController: UIPageViewControllerDelegate {
public func pageViewController(_ pageViewController: UIPageViewController, willTransitionTo pendingViewControllers: [UIViewController]) {
guard let vc = pendingViewControllers.first else {
return
......@@ -215,19 +250,11 @@ extension PageController: UIPageViewControllerDelegate {
return
}
guard let vc = previousViewControllers.first else {
return
}
guard let _ = viewControllers.index(of: vc) else {
return
}
tabBar.select(at: selectedIndex)
pageTabBar.select(at: selectedIndex)
}
}
extension PageController: UIPageViewControllerDataSource {
extension PageTabBarController: UIPageViewControllerDataSource {
public func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
guard let current = viewControllers.index(of: viewController) else {
return nil
......@@ -258,18 +285,18 @@ extension PageController: UIPageViewControllerDataSource {
}
}
extension PageController: UIScrollViewDelegate {
extension PageTabBarController: UIScrollViewDelegate {
public func scrollViewDidScroll(_ scrollView: UIScrollView) {
guard 0 < view.width else {
return
}
guard let selected = tabBar.selected else {
guard let selected = pageTabBar.selected else {
return
}
let x = (scrollView.contentOffset.x - view.width) / scrollView.contentSize.width * view.width
tabBar.line.x = selected.x + x
pageTabBar.line.x = selected.x + x
}
}
......@@ -110,7 +110,7 @@ open class TabBar: View {
}
/// The currently selected button.
open var selected: UIButton?
open internal(set) var selected: UIButton?
/// Buttons.
open var buttons = [UIButton]() {
......@@ -125,6 +125,19 @@ open class TabBar: View {
}
}
/// A boolean to animate the line when touched.
open var isLineAnimated = true {
didSet {
for b in buttons {
if isLineAnimated {
prepareLineAnimationHandler(button: b)
} else {
removeLineAnimationHandler(button: b)
}
}
}
}
/// A reference to the line UIView.
internal var line: UIView!
......@@ -167,8 +180,9 @@ open class TabBar: View {
b.grid.columns = columns
b.contentEdgeInsets = .zero
b.layer.cornerRadius = 0
b.removeTarget(self, action: #selector(handleButton(button:)), for: .touchUpInside)
b.addTarget(self, action: #selector(handleButton(button:)), for: .touchUpInside)
if isLineAnimated {
prepareLineAnimationHandler(button: b)
}
}
grid.reload()
......@@ -205,7 +219,7 @@ open class TabBar: View {
- Parameter to button: A UIButton.
- Paramater completion: An optional completion block.
*/
internal func animate(to button: UIButton, completion: (@escaping (UIButton) -> Void)? = nil) {
open func animate(to button: UIButton, completion: (@escaping (UIButton) -> Void)? = nil) {
delegate?.tabBarWillSelectButton?(tabBar: self, button: button)
selected = button
......@@ -253,4 +267,21 @@ open class TabBar: View {
private func prepareDivider() {
divider = Divider(view: self)
}
/**
Prepares the line animation handlers.
- Parameter button: A UIButton.
*/
private func prepareLineAnimationHandler(button: UIButton) {
removeLineAnimationHandler(button: button)
button.addTarget(self, action: #selector(handleButton(button:)), for: .touchUpInside)
}
/**
Removes the line animation handlers.
- Parameter button: A UIButton.
*/
private func removeLineAnimationHandler(button: UIButton) {
button.removeTarget(self, action: #selector(handleButton(button:)), for: .touchUpInside)
}
}
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