Commit 0c996578 by Daniel Dahan

scroll view working correctly when swiping using the TabMenuController

parent ef586d12
...@@ -80,6 +80,7 @@ extension UIViewController { ...@@ -80,6 +80,7 @@ extension UIViewController {
} }
open class TabMenuController: UIViewController { open class TabMenuController: UIViewController {
/// A reference to the currently selected view controller index value.
@IBInspectable @IBInspectable
open var selectedIndex = 0 open var selectedIndex = 0
...@@ -101,6 +102,9 @@ open class TabMenuController: UIViewController { ...@@ -101,6 +102,9 @@ open class TabMenuController: UIViewController {
@IBInspectable @IBInspectable
open let scrollView = UIScrollView() open let scrollView = UIScrollView()
/// Previous scroll view content offset.
fileprivate var previousContentOffset: CGFloat = 0
/// An Array of UIViewControllers. /// An Array of UIViewControllers.
open var viewControllers: [UIViewController] { open var viewControllers: [UIViewController] {
didSet { didSet {
...@@ -122,9 +126,6 @@ open class TabMenuController: UIViewController { ...@@ -122,9 +126,6 @@ open class TabMenuController: UIViewController {
/// The number of views used in the scrollViewPool. /// The number of views used in the scrollViewPool.
fileprivate let viewPoolCount = 3 fileprivate let viewPoolCount = 3
/// The last scroll view offset position.
fileprivate var scrollViewDirection = 0
/** /**
An initializer that initializes the object with a NSCoder object. An initializer that initializes the object with a NSCoder object.
- Parameter aDecoder: A NSCoder instance. - Parameter aDecoder: A NSCoder instance.
...@@ -222,14 +223,14 @@ extension TabMenuController { ...@@ -222,14 +223,14 @@ extension TabMenuController {
return return
} }
let count = viewPoolCount < n ? viewPoolCount : n let m = viewPoolCount < n ? viewPoolCount : n
if 0 == selectedIndex { if 0 == selectedIndex {
for i in 0..<count { for i in 0..<m {
prepareViewController(at: i) prepareViewController(at: i)
} }
} else if n - 1 == selectedIndex { } else if n - 1 == selectedIndex {
for i in 0..<count { for i in 0..<m {
prepareViewController(at: selectedIndex - i) prepareViewController(at: selectedIndex - i)
} }
} else { } else {
...@@ -318,28 +319,29 @@ extension TabMenuController { ...@@ -318,28 +319,29 @@ extension TabMenuController {
fileprivate func layoutViewControllers() { fileprivate func layoutViewControllers() {
let n = viewControllers.count let n = viewControllers.count
let count = viewPoolCount < n ? viewPoolCount : n scrollView.contentSize = CGSize(width: scrollView.width * CGFloat(n), height: scrollView.height)
scrollView.contentSize = CGSize(width: scrollView.width * CGFloat(count), height: scrollView.height)
guard 1 < n else { guard 1 < n else {
layoutViewController(at: 0, position: 0) layoutViewController(at: 0, position: 0)
return return
} }
let m = viewPoolCount < n ? viewPoolCount : n
if 0 == selectedIndex { if 0 == selectedIndex {
for i in 0..<count { for i in 0..<m {
layoutViewController(at: i, position: i) layoutViewController(at: i, position: i)
} }
} else if n - 1 == selectedIndex { } else if n - 1 == selectedIndex {
for i in 0..<count { var q = 0
layoutViewController(at: selectedIndex - i, position: count - i - 1) for i in 0..<m {
q = selectedIndex - i
layoutViewController(at: q, position: q)
} }
} else { } else {
layoutViewController(at: selectedIndex, position: 1) layoutViewController(at: selectedIndex, position: selectedIndex)
layoutViewController(at: selectedIndex - 1, position: 0) layoutViewController(at: selectedIndex - 1, position: selectedIndex - 1)
layoutViewController(at: selectedIndex + 1, position: 2) layoutViewController(at: selectedIndex + 1, position: selectedIndex + 1)
scrollView.setContentOffset(CGPoint(x: scrollView.width, y: 0), animated: false)
} }
} }
...@@ -365,8 +367,6 @@ extension TabMenuController { ...@@ -365,8 +367,6 @@ extension TabMenuController {
return return
} }
let count = viewPoolCount < n ? viewPoolCount : n
if 0 == selectedIndex { if 0 == selectedIndex {
for i in 1..<n { for i in 1..<n {
removeViewController(at: i) removeViewController(at: i)
...@@ -427,15 +427,15 @@ extension TabMenuController { ...@@ -427,15 +427,15 @@ extension TabMenuController {
return return
} }
guard let index = tb.buttons.index(of: button) else { guard let i = tb.buttons.index(of: button) else {
return return
} }
guard index != selectedIndex else { guard i != selectedIndex else {
return return
} }
selectedIndex = index selectedIndex = i
removeViewControllers() removeViewControllers()
prepareViewControllers() prepareViewControllers()
...@@ -454,9 +454,9 @@ extension TabMenuController: UIScrollViewDelegate { ...@@ -454,9 +454,9 @@ extension TabMenuController: UIScrollViewDelegate {
return return
} }
guard let selected = tb.selected else { // guard let selected = tb.selected else {
return // return
} // }
// let x = (scrollView.contentOffset.x - scrollView.width) / scrollView.contentSize.width * scrollView.width // let x = (scrollView.contentOffset.x - scrollView.width) / scrollView.contentSize.width * scrollView.width
// tb.line.center.x = selected.center.x + x // tb.line.center.x = selected.center.x + x
...@@ -464,18 +464,30 @@ extension TabMenuController: UIScrollViewDelegate { ...@@ -464,18 +464,30 @@ extension TabMenuController: UIScrollViewDelegate {
@objc @objc
open func scrollViewWillBeginDragging(_ scrollView: UIScrollView) { open func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
let translation = scrollView.panGestureRecognizer.translation(in: scrollView.superview) previousContentOffset = scrollView.contentOffset.x
scrollViewDirection = 0 > translation.x ? 1 : -1
} }
@objc @objc
open func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { open func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
let index = selectedIndex + scrollViewDirection let n = viewControllers.count
guard 0 <= index && index < viewControllers.count else { let x = scrollView.contentOffset.x
let p = previousContentOffset == x ? 0 : previousContentOffset < x ? 1 : -1
guard 0 != p else {
return
}
let i = selectedIndex + p
guard selectedIndex != i else {
return
}
guard 0 <= i && i < n else {
return return
} }
selectedIndex = index selectedIndex = i
removeViewControllers() removeViewControllers()
prepareViewControllers() prepareViewControllers()
......
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