Merge branch 'swift' of github.com:xmartlabs/XLPagerTabStrip into swift

This commit is contained in:
Santiago Fernandez 2016-01-22 11:47:25 -03:00
commit aec1610fcb
7 changed files with 170 additions and 196 deletions

View File

@ -24,7 +24,7 @@ public class NavButtonBarExampleViewController: ButtonBarPagerTabStripViewContro
buttonBarView.removeFromSuperview()
navigationController?.navigationBar.addSubview(buttonBarView)
changeCurrentIndexProgressive = { (oldCell: ButtonBarViewCell?, newCell: ButtonBarViewCell?, progressPercentage: Float, changeCurrentIndex: Bool, animated: Bool) -> Void in
changeCurrentIndexProgressive = { (oldCell: ButtonBarViewCell?, newCell: ButtonBarViewCell?, progressPercentage: CGFloat, changeCurrentIndex: Bool, animated: Bool) -> Void in
guard changeCurrentIndex == true else { return }
oldCell?.label.textColor = UIColor(white: 1, alpha: 0.6)

View File

@ -24,7 +24,7 @@
import Foundation
public class BarPagerTabStripViewController: PagerTabStripViewController {
public class BarPagerTabStripViewController: PagerTabStripViewController, PagerTabStripViewControllerDataSource, PagerTabStripViewControllerIsProgressiveDelegate {
@IBOutlet lazy public var barView: BarView! = { [unowned self] in
let barView = BarView(frame: CGRectMake(0, 0, self.view.frame.size.width, 5.0))
@ -34,6 +34,18 @@ public class BarPagerTabStripViewController: PagerTabStripViewController {
return barView
}()
public override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
delegate = self
datasource = self
}
required public init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
delegate = self
datasource = self
}
public override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
if barView.superview == nil {
@ -53,11 +65,11 @@ public class BarPagerTabStripViewController: PagerTabStripViewController {
// MARK: - PagerTabStripViewControllerDelegate
public override func pagerTabStripViewController(pagerTabStripViewController: PagerTabStripViewController, updateIndicatorFromIndex fromIndex: Int, toIndex: Int) throws {
public func pagerTabStripViewController(pagerTabStripViewController: PagerTabStripViewController, updateIndicatorFromIndex fromIndex: Int, toIndex: Int) throws {
barView.moveToIndex(index: toIndex, animated: true)
}
public override func pagerTabStripViewController(pagerTabStripViewController: PagerTabStripViewController, updateIndicatorFromIndex fromIndex: Int, toIndex: Int, withProgressPercentage progressPercentage: Float, indexWasChanged: Bool) throws {
public func pagerTabStripViewController(pagerTabStripViewController: PagerTabStripViewController, updateIndicatorFromIndex fromIndex: Int, toIndex: Int, withProgressPercentage progressPercentage: CGFloat, indexWasChanged: Bool) throws {
barView.moveToIndex(fromIndex: fromIndex, toIndex: toIndex, progressPercentage: progressPercentage)
}
}

View File

@ -72,7 +72,7 @@ public class BarView: UIView {
updateSelectedBarPositionWithAnimation(animated)
}
public func moveToIndex(fromIndex fromIndex: Int, toIndex: Int, progressPercentage: Float) {
public func moveToIndex(fromIndex fromIndex: Int, toIndex: Int, progressPercentage: CGFloat) {
selectedIndex = (progressPercentage > 0.5) ? toIndex : fromIndex
var newFrame = selectedBar.frame

View File

@ -24,10 +24,10 @@
import Foundation
public class ButtonBarPagerTabStripViewController: PagerTabStripViewController, UICollectionViewDelegate, UICollectionViewDataSource {
public class ButtonBarPagerTabStripViewController: PagerTabStripViewController, PagerTabStripViewControllerDataSource, PagerTabStripViewControllerIsProgressiveDelegate, UICollectionViewDelegate, UICollectionViewDataSource {
public var changeCurrentIndex: ((oldCell: ButtonBarViewCell?, newCell: ButtonBarViewCell?, animated: Bool) -> Void)? = { _ in }
public var changeCurrentIndexProgressive: ((oldCell: ButtonBarViewCell?, newCell: ButtonBarViewCell?, progressPercentage: Float, changeCurrentIndex: Bool, animated: Bool) -> Void)? = { _ in }
public var changeCurrentIndexProgressive: ((oldCell: ButtonBarViewCell?, newCell: ButtonBarViewCell?, progressPercentage: CGFloat, changeCurrentIndex: Bool, animated: Bool) -> Void)? = { _ in }
@IBOutlet public lazy var buttonBarView: ButtonBarView! = { [unowned self] in
var flowLayout = UICollectionViewFlowLayout()
@ -62,10 +62,14 @@ public class ButtonBarPagerTabStripViewController: PagerTabStripViewController,
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
delegate = self
datasource = self
}
required public init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
delegate = self
datasource = self
}
public override func viewDidLoad() {
@ -125,11 +129,6 @@ public class ButtonBarPagerTabStripViewController: PagerTabStripViewController,
}
}
public override func willRotateToInterfaceOrientation(toInterfaceOrientation: UIInterfaceOrientation, duration: NSTimeInterval) {
super.willRotateToInterfaceOrientation(toInterfaceOrientation, duration: duration)
isViewRotating = true
}
// MARK: - Public Methods
public override func reloadPagerTabStripView() {
@ -167,7 +166,7 @@ public class ButtonBarPagerTabStripViewController: PagerTabStripViewController,
return calculateStretchedCellWidths(minimumCellWidths, suggestedStretchedCellWidth: newSuggestedStretchedCellWidth, previousNumberOfLargeCells: numberOfLargeCells)
}
public override func pagerTabStripViewController(pagerTabStripViewController: PagerTabStripViewController, updateIndicatorFromIndex fromIndex: Int, toIndex: Int) throws {
public func pagerTabStripViewController(pagerTabStripViewController: PagerTabStripViewController, updateIndicatorFromIndex fromIndex: Int, toIndex: Int) throws {
guard shouldUpdateButtonBarView else { return }
let direction: SwipeDirection = (toIndex < fromIndex) ? .Right : .Left
@ -179,7 +178,7 @@ public class ButtonBarPagerTabStripViewController: PagerTabStripViewController,
}
}
public override func pagerTabStripViewController(pagerTabStripViewController: PagerTabStripViewController, updateIndicatorFromIndex fromIndex: Int, toIndex: Int, withProgressPercentage progressPercentage: Float, indexWasChanged: Bool) throws {
public func pagerTabStripViewController(pagerTabStripViewController: PagerTabStripViewController, updateIndicatorFromIndex fromIndex: Int, toIndex: Int, withProgressPercentage progressPercentage: CGFloat, indexWasChanged: Bool) throws {
guard shouldUpdateButtonBarView else { return }
buttonBarView.moveFromIndex(fromIndex, toIndex: toIndex, progressPercentage: progressPercentage, pagerScroll: .YES)

View File

@ -63,7 +63,7 @@ public class ButtonBarView: UICollectionView {
updateSelectedBarPosition(animated, swipeDirection: swipeDirection, pagerScroll: pagerScroll)
}
public func moveFromIndex(fromIndex: Int, toIndex: Int, progressPercentage: Float,pagerScroll: PagerScroll) -> Void {
public func moveFromIndex(fromIndex: Int, toIndex: Int, progressPercentage: CGFloat,pagerScroll: PagerScroll) -> Void {
selectedIndex = (progressPercentage > 0.5) ? toIndex : fromIndex
let fromFrame = layoutAttributesForItemAtIndexPath(NSIndexPath(forItem: fromIndex, inSection: 0))!.frame
@ -86,8 +86,8 @@ public class ButtonBarView: UICollectionView {
var targetFrame = fromFrame
targetFrame.size.height = selectedBar.frame.size.height
targetFrame.size.width += (toFrame.size.width - fromFrame.size.width) * CGFloat(progressPercentage)
targetFrame.origin.x += (toFrame.origin.x - fromFrame.origin.x) * CGFloat(progressPercentage)
targetFrame.size.width += (toFrame.size.width - fromFrame.size.width) * progressPercentage
targetFrame.origin.x += (toFrame.origin.x - fromFrame.origin.x) * progressPercentage
selectedBar.frame = CGRectMake(targetFrame.origin.x, selectedBar.frame.origin.y, targetFrame.size.width, selectedBar.frame.size.height)
@ -96,7 +96,7 @@ public class ButtonBarView: UICollectionView {
let toContentOffset = contentOffsetForCell(withFrame: toFrame, andIndex: toIndex)
let fromContentOffset = contentOffsetForCell(withFrame: fromFrame, andIndex: fromIndex)
targetContentOffset = fromContentOffset + ((toContentOffset - fromContentOffset) * CGFloat(progressPercentage))
targetContentOffset = fromContentOffset + ((toContentOffset - fromContentOffset) * progressPercentage)
}
let animated = abs(contentOffset.x - targetContentOffset) > 30 || (fromIndex == toIndex)

View File

@ -36,8 +36,12 @@ public protocol PagerTabStripChildItem {
public protocol PagerTabStripViewControllerDelegate: class {
func pagerTabStripViewController(pagerTabStripViewController: PagerTabStripViewController, updateIndicatorFromIndex fromIndex: Int, toIndex: Int) throws
func pagerTabStripViewController(pagerTabStripViewController: PagerTabStripViewController, updateIndicatorFromIndex fromIndex: Int, toIndex: Int, withProgressPercentage progressPercentage: Float, indexWasChanged: Bool) throws
}
public protocol PagerTabStripViewControllerIsProgressiveDelegate : PagerTabStripViewControllerDelegate {
func pagerTabStripViewController(pagerTabStripViewController: PagerTabStripViewController, updateIndicatorFromIndex fromIndex: Int, toIndex: Int, withProgressPercentage progressPercentage: CGFloat, indexWasChanged: Bool) throws
}
public protocol PagerTabStripViewControllerDataSource: class {
@ -48,8 +52,7 @@ public protocol PagerTabStripViewControllerDataSource: class {
//MARK: PagerTabStripViewController
public class PagerTabStripViewController: UIViewController, UIScrollViewDelegate, PagerTabStripViewControllerDataSource, PagerTabStripViewControllerDelegate {
public class PagerTabStripViewController: UIViewController, UIScrollViewDelegate {
@IBOutlet lazy public var containerView: UIScrollView! = { [unowned self] in
let containerView = UIScrollView(frame: CGRectMake(0, 0, CGRectGetWidth(self.view.bounds), CGRectGetHeight(self.view.bounds)))
@ -69,22 +72,28 @@ public class PagerTabStripViewController: UIViewController, UIScrollViewDelegate
return CGRectGetWidth(containerView.bounds)
}
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
delegate = self
datasource = self
public var scrollPercentage: CGFloat {
if swipeDirection != .Right {
let module = fmod(containerView.contentOffset.x, pageWidth)
return module == 0.0 ? 1.0 : module / pageWidth
}
return 1 - fmod(containerView.contentOffset.x >= 0 ? containerView.contentOffset.x : pageWidth + containerView.contentOffset.x, pageWidth) / pageWidth
}
required public init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
delegate = self
datasource = self
public var swipeDirection: SwipeDirection {
if containerView.contentOffset.x > lastContentOffset {
return .Left
}
else if containerView.contentOffset.x < lastContentOffset {
return .Right
}
return .None
}
override public func viewDidLoad() {
super.viewDidLoad()
if containerView.superview == nil {
view.addSubview(containerView!)
view.addSubview(containerView)
}
containerView.bounces = true
containerView.alwaysBounceHorizontal = true
@ -97,16 +106,15 @@ public class PagerTabStripViewController: UIViewController, UIScrollViewDelegate
guard let dataSource = datasource else {
fatalError("dataSource must not be nil")
}
let childViewControllers = dataSource.childViewControllersForPagerTabStripViewController(self)
guard childViewControllers.count != 0 else {
viewControllers = dataSource.childViewControllersForPagerTabStripViewController(self)
guard viewControllers.count != 0 else {
fatalError("childViewControllersForPagerTabStripViewController should provide at least one child view controller")
}
viewControllers = childViewControllers
}
override public func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
lastSize = containerView!.bounds.size
lastSize = containerView.bounds.size
updateIfNeeded()
}
@ -120,17 +128,18 @@ public class PagerTabStripViewController: UIViewController, UIScrollViewDelegate
}
public func moveToViewControllerAtIndex(index: Int, animated: Bool) {
if !isViewLoaded() || view.window == nil {
guard isViewLoaded() && view.window != nil else {
currentIndex = index
return
}
if animated && pagerOptions.contains(.SkipIntermediateViewControllers) && abs(currentIndex - index) > 1 {
var tmpChildViewControllers = viewControllers
var tmpViewControllers = viewControllers
let currentChildVC = viewControllers[currentIndex]
let fromIndex = currentIndex < index ? index - 1 : index + 1
let fromChildVC = viewControllers[fromIndex]
tmpChildViewControllers[currentIndex] = fromChildVC
tmpChildViewControllers[fromIndex] = currentChildVC
pagerTabStripChildViewControllersForScrolling = tmpChildViewControllers
tmpViewControllers[currentIndex] = fromChildVC
tmpViewControllers[fromIndex] = currentChildVC
pagerTabStripChildViewControllersForScrolling = tmpViewControllers
containerView.setContentOffset(CGPointMake(pageOffsetForChildIndex(index: fromIndex), 0), animated: false)
(navigationController?.view ?? view).userInteractionEnabled = false
containerView.setContentOffset(CGPointMake(pageOffsetForChildIndex(index: index), 0), animated: true)
@ -155,41 +164,23 @@ public class PagerTabStripViewController: UIViewController, UIScrollViewDelegate
return []
}
//MARK: - PagerTabStripViewControllerDelegate
public func pagerTabStripViewController(pagerTabStripViewController: PagerTabStripViewController, updateIndicatorFromIndex fromIndex: Int, toIndex: Int) throws {
}
public func pagerTabStripViewController(pagerTabStripViewController: PagerTabStripViewController, updateIndicatorFromIndex fromIndex: Int, toIndex: Int, withProgressPercentage progressPercentage: Float, indexWasChanged: Bool) throws {
}
//MARK: - Helpers
public func updateIfNeeded() {
if !CGSizeEqualToSize(lastSize, containerView!.bounds.size){
if !CGSizeEqualToSize(lastSize, containerView.bounds.size){
updateContent()
}
}
public func swipeDirection() -> SwipeDirection {
if containerView.contentOffset.x > lastContentOffset {
return .Left
}
else if containerView.contentOffset.x < lastContentOffset {
return .Right
}
return .None
}
public func canMoveToIndex(index index: Int) -> Bool{
public func canMoveToIndex(index index: Int) -> Bool {
return currentIndex != index && viewControllers.count > index
}
public func pageOffsetForChildIndex(index index: Int) -> CGFloat{
public func pageOffsetForChildIndex(index index: Int) -> CGFloat {
return CGFloat(index) * CGRectGetWidth(containerView.bounds)
}
public func offsetForChildIndex(index index: Int) -> CGFloat{
public func offsetForChildIndex(index: Int) -> CGFloat{
return (CGFloat(index) * CGRectGetWidth(containerView.bounds)) + ((CGRectGetWidth(containerView.bounds) - CGRectGetWidth(view.bounds)) * 0.5)
}
@ -197,71 +188,54 @@ public class PagerTabStripViewController: UIViewController, UIScrollViewDelegate
guard let index = viewControllers.indexOf(viewController) else {
throw PagerTabStripError.ViewControllerNotContainedInPagerTabStripChildViewControllers
}
return offsetForChildIndex(index: index)
return offsetForChildIndex(index)
}
public func pageForContentOffset(contentOffset contentOffset: CGFloat) -> Int{
let result = self.virtualPageForContentOffset(contentOffset: contentOffset)
return self.pageForVirtualPage(virtualPage: result)
public func pageForContentOffset(contentOffset: CGFloat) -> Int {
let result = virtualPageForContentOffset(contentOffset)
return pageForVirtualPage(result)
}
public func virtualPageForContentOffset(contentOffset contentOffset: CGFloat) -> Int{
public func virtualPageForContentOffset(contentOffset: CGFloat) -> Int {
return Int((contentOffset + 1.5 * pageWidth) / pageWidth) - 1
}
public func pageForVirtualPage(virtualPage virtualPage: Int) -> Int{
public func pageForVirtualPage(virtualPage: Int) -> Int{
if virtualPage < 0 {
return 0
}
if virtualPage > viewControllers.count - 1 { return viewControllers.count - 1 }
if virtualPage > viewControllers.count - 1 {
return viewControllers.count - 1
}
return virtualPage
}
public func scrollPercentage() -> CGFloat{
if swipeDirection() != .Right {
if fmod(containerView.contentOffset.x, pageWidth) == 0.0{
return 1.0
}
return fmod(containerView.contentOffset.x, pageWidth) / pageWidth
}
return 1 - fmod(containerView.contentOffset.x >= 0 ? containerView!.contentOffset.x : pageWidth + containerView.contentOffset.x, pageWidth) / pageWidth;
}
public func updateContent() {
if !CGSizeEqualToSize(lastSize, containerView.bounds.size) {
if lastSize.width != containerView.bounds.size.width {
lastSize = containerView.bounds.size
containerView.contentOffset = CGPointMake(pageOffsetForChildIndex(index: currentIndex), 0)
}
else {
lastSize = containerView.bounds.size
}
if lastSize.width != containerView.bounds.size.width {
lastSize = containerView.bounds.size
containerView.contentOffset = CGPointMake(pageOffsetForChildIndex(index: currentIndex), 0)
}
lastSize = containerView.bounds.size
let childViewControllers = getPagerTabStripChildViewControllersForScrolling
containerView.contentSize = CGSizeMake(CGRectGetWidth(containerView.bounds) * CGFloat(childViewControllers.count), containerView.contentSize.height)
let pagerViewControllers = pagerTabStripChildViewControllersForScrolling ?? viewControllers
containerView.contentSize = CGSizeMake(CGRectGetWidth(containerView.bounds) * CGFloat(pagerViewControllers.count), containerView.contentSize.height)
for (index, childController) in childViewControllers.enumerate(){
for (index, childController) in pagerViewControllers.enumerate() {
let pageOffsetForChild = pageOffsetForChildIndex(index: index)
if fabs(containerView.contentOffset.x - pageOffsetForChild) < CGRectGetWidth(containerView.bounds) {
if childController.parentViewController == nil {
if let _ = childController.parentViewController {
childController.view.frame = CGRectMake(offsetForChildIndex(index), 0, CGRectGetWidth(view.bounds), CGRectGetHeight(containerView.bounds))
childController.view.autoresizingMask = [.FlexibleHeight, .FlexibleWidth]
}
else {
addChildViewController(childController)
childController.beginAppearanceTransition(true, animated: false)
let childPosition = offsetForChildIndex(index: index)
childController.view.frame = CGRectMake(childPosition, 0, CGRectGetWidth(view.bounds), CGRectGetHeight(containerView.bounds))
childController.view.frame = CGRectMake(offsetForChildIndex(index), 0, CGRectGetWidth(view.bounds), CGRectGetHeight(containerView.bounds))
childController.view.autoresizingMask = [.FlexibleHeight, .FlexibleWidth]
containerView.addSubview(childController.view)
childController.didMoveToParentViewController(self)
childController.endAppearanceTransition()
}
else {
let childPosition = offsetForChildIndex(index: index)
childController.view.frame = CGRectMake(childPosition, 0, CGRectGetWidth(view.bounds), CGRectGetHeight(containerView.bounds))
childController.view.autoresizingMask = [.FlexibleHeight, .FlexibleWidth]
}
}
else {
if let _ = childController.parentViewController {
@ -275,75 +249,37 @@ public class PagerTabStripViewController: UIViewController, UIScrollViewDelegate
}
let oldCurrentIndex = currentIndex
let virtualPage = virtualPageForContentOffset(contentOffset: containerView.contentOffset.x)
let newCurrentIndex = pageForVirtualPage(virtualPage: virtualPage)
let virtualPage = virtualPageForContentOffset(containerView.contentOffset.x)
let newCurrentIndex = pageForVirtualPage(virtualPage)
currentIndex = newCurrentIndex
let changeCurrentIndex = newCurrentIndex != oldCurrentIndex
if pagerOptions.contains(.IsProgressiveIndicator) {
// FIXME: - check if delegate implements? pagerTabStripViewController(pagerTabStripViewController: XLPagerTabStripViewController, updateIndicatorFromIndex fromIndex: Int, toIndex index: Int, withProgressPercentage progressPercentage: Float, indexWasChanged changed: Bool)
if let progressiveDeledate = self as? PagerTabStripViewControllerIsProgressiveDelegate where pagerOptions.contains(.IsProgressiveIndicator) {
let scrollPercentage = self.scrollPercentage()
if scrollPercentage > 0 {
var fromIndex = currentIndex
var toIndex = currentIndex
let direction = swipeDirection()
if direction == .Left {
if virtualPage > getPagerTabStripChildViewControllersForScrolling.count - 1 {
fromIndex = getPagerTabStripChildViewControllersForScrolling.count - 1
toIndex = getPagerTabStripChildViewControllersForScrolling.count
}
else {
if scrollPercentage >= 0.5 {
fromIndex = max(toIndex - 1, 0)
}
else {
toIndex = fromIndex + 1
}
}
}
else if direction == .Right {
if virtualPage < 0 {
fromIndex = 0
toIndex = -1
}
else {
if scrollPercentage > 0.5 {
fromIndex = min(toIndex + 1, getPagerTabStripChildViewControllersForScrolling.count - 1)
}
else {
toIndex = fromIndex - 1
}
}
}
try! delegate?.pagerTabStripViewController(self, updateIndicatorFromIndex: fromIndex, toIndex: toIndex, withProgressPercentage: Float(pagerOptions.contains(.IsElasticIndicatorLimit) ? scrollPercentage : (toIndex < 0 || toIndex >= getPagerTabStripChildViewControllersForScrolling.count ? CGFloat(0) : scrollPercentage)), indexWasChanged: changeCurrentIndex)
}
let (fromIndex, toIndex, scrollPercentage) = progressiveIndicatorData(virtualPage)
try! progressiveDeledate.pagerTabStripViewController(self, updateIndicatorFromIndex: fromIndex, toIndex: toIndex, withProgressPercentage: scrollPercentage, indexWasChanged: changeCurrentIndex)
}
else{
try! delegate?.pagerTabStripViewController(self, updateIndicatorFromIndex: min(oldCurrentIndex, getPagerTabStripChildViewControllersForScrolling.count - 1), toIndex: newCurrentIndex)
try! delegate?.pagerTabStripViewController(self, updateIndicatorFromIndex: min(oldCurrentIndex, pagerViewControllers.count - 1), toIndex: newCurrentIndex)
}
}
public func reloadPagerTabStripView() {
if isViewLoaded() {
for childController in viewControllers {
if let _ = childController.parentViewController {
childController.view.removeFromSuperview()
childController.willMoveToParentViewController(nil)
childController.removeFromParentViewController()
}
guard isViewLoaded() else { return }
for childController in viewControllers {
if let _ = childController.parentViewController {
childController.view.removeFromSuperview()
childController.willMoveToParentViewController(nil)
childController.removeFromParentViewController()
}
viewControllers = datasource?.childViewControllersForPagerTabStripViewController(self) ?? []
containerView.contentSize = CGSizeMake(CGRectGetWidth(containerView.bounds) * CGFloat(viewControllers.count), containerView.contentSize.height)
if currentIndex >= viewControllers.count {
currentIndex = viewControllers.count - 1
}
containerView.contentOffset = CGPointMake(pageOffsetForChildIndex(index: currentIndex), 0)
updateContent()
}
viewControllers = datasource?.childViewControllersForPagerTabStripViewController(self) ?? []
containerView.contentSize = CGSizeMake(CGRectGetWidth(containerView.bounds) * CGFloat(viewControllers.count), containerView.contentSize.height)
if currentIndex >= viewControllers.count {
currentIndex = viewControllers.count - 1
}
containerView.contentOffset = CGPointMake(pageOffsetForChildIndex(index: currentIndex), 0)
updateContent()
}
//MARK: - UIScrollDelegate
@ -356,7 +292,7 @@ public class PagerTabStripViewController: UIViewController, UIScrollViewDelegate
public func scrollViewWillBeginDragging(scrollView: UIScrollView) {
if containerView == scrollView {
lastPageNumber = pageForContentOffset(contentOffset: scrollView.contentOffset.x)
lastPageNumber = pageForContentOffset(scrollView.contentOffset.x)
lastContentOffset = scrollView.contentOffset.x
}
}
@ -364,12 +300,7 @@ public class PagerTabStripViewController: UIViewController, UIScrollViewDelegate
public func scrollViewDidEndScrollingAnimation(scrollView: UIScrollView) {
if containerView == scrollView {
pagerTabStripChildViewControllersForScrolling = nil
if let navigationController = navigationController {
navigationController.view.userInteractionEnabled = true
}
else{
view.userInteractionEnabled = true
}
(navigationController?.view ?? view).userInteractionEnabled = true
updateContent()
}
}
@ -379,21 +310,55 @@ public class PagerTabStripViewController: UIViewController, UIScrollViewDelegate
public override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)
pageBeforeRotate = currentIndex
coordinator.animateAlongsideTransition(nil) { (context) -> Void in
self.currentIndex = self.pageBeforeRotate
self.updateIfNeeded()
coordinator.animateAlongsideTransition(nil) { [weak self] _ in
guard let me = self else { return }
me.currentIndex = me.pageBeforeRotate
me.updateIfNeeded()
}
}
public override func willRotateToInterfaceOrientation(toInterfaceOrientation: UIInterfaceOrientation, duration: NSTimeInterval) {
pageBeforeRotate = currentIndex
}
//MARK: Private
private func progressiveIndicatorData(virtualPage: Int) -> (Int, Int, CGFloat) {
let count = viewControllers.count
var fromIndex = currentIndex
var toIndex = currentIndex
let direction = swipeDirection
if direction == .Left {
if virtualPage > count - 1 {
fromIndex = count - 1
toIndex = count
}
else {
if self.scrollPercentage >= 0.5 {
fromIndex = max(toIndex - 1, 0)
}
else {
toIndex = fromIndex + 1
}
}
}
else if direction == .Right {
if virtualPage < 0 {
fromIndex = 0
toIndex = -1
}
else {
if self.scrollPercentage > 0.5 {
fromIndex = min(toIndex + 1, count - 1)
}
else {
toIndex = fromIndex - 1
}
}
}
let scrollPercentage = pagerOptions.contains(.IsElasticIndicatorLimit) ? self.scrollPercentage : ((toIndex < 0 || toIndex >= count) ? 0.0 : self.scrollPercentage)
return (fromIndex, toIndex, scrollPercentage)
}
private var pagerTabStripChildViewControllersForScrolling : [UIViewController]?
private var getPagerTabStripChildViewControllersForScrolling : [UIViewController] {
return pagerTabStripChildViewControllersForScrolling ?? viewControllers
}
private var lastPageNumber = 0
private var lastContentOffset: CGFloat = 0.0
private var pageBeforeRotate = 0

View File

@ -25,10 +25,22 @@
import Foundation
public class SegmentedPagerTabStripViewController: PagerTabStripViewController {
public class SegmentedPagerTabStripViewController: PagerTabStripViewController, PagerTabStripViewControllerDataSource, PagerTabStripViewControllerDelegate {
@IBOutlet lazy public var segmentedControl: UISegmentedControl! = UISegmentedControl()
public override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
delegate = self
datasource = self
}
required public init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
delegate = self
datasource = self
}
var shouldUpdateSegmentedControl = true
public override func viewDidLoad() {
@ -47,7 +59,7 @@ public class SegmentedPagerTabStripViewController: PagerTabStripViewController {
}
}
func reloadSegmentedControl() throws -> Void {
func reloadSegmentedControl() throws {
segmentedControl.removeAllSegments()
for (index, item) in viewControllers.enumerate(){
guard let child = item as? PagerTabStripChildItem else {
@ -70,7 +82,7 @@ public class SegmentedPagerTabStripViewController: PagerTabStripViewController {
}
}
func segmentedControlChanged(sender: UISegmentedControl) -> Void{
func segmentedControlChanged(sender: UISegmentedControl) {
let index = sender.selectedSegmentIndex
try! pagerTabStripViewController(self, updateIndicatorFromIndex: currentIndex, toIndex: index)
shouldUpdateSegmentedControl = false
@ -79,32 +91,18 @@ public class SegmentedPagerTabStripViewController: PagerTabStripViewController {
// MARK: - PagerTabStripViewControllerDelegate
override public func pagerTabStripViewController(pagerTabStripViewController: PagerTabStripViewController, updateIndicatorFromIndex fromIndex: Int, toIndex: Int) throws {
try super.pagerTabStripViewController(pagerTabStripViewController, updateIndicatorFromIndex: fromIndex, toIndex: toIndex)
if shouldUpdateSegmentedControl {
public func pagerTabStripViewController(pagerTabStripViewController: PagerTabStripViewController, updateIndicatorFromIndex fromIndex: Int, toIndex: Int) throws {
if shouldUpdateSegmentedControl {
guard let child = viewControllers[toIndex] as? PagerTabStripChildItem else {
throw PagerTabStripError.CurrentIndexIsGreaterThanChildsCount
}
if let color = child.childHeaderForPagerTabStripViewController(self).color{
if let color = child.childHeaderForPagerTabStripViewController(self).color {
segmentedControl.tintColor = color
}
segmentedControl.selectedSegmentIndex = toIndex
}
}
public override func pagerTabStripViewController(pagerTabStripViewController: PagerTabStripViewController, updateIndicatorFromIndex fromIndex: Int, toIndex index: Int, withProgressPercentage progressPercentage: Float, indexWasChanged changed: Bool) throws {
if shouldUpdateSegmentedControl{
let currentIndex = (progressPercentage > 0.5) ? index : fromIndex
guard let child = viewControllers[currentIndex] as? PagerTabStripChildItem else {
throw PagerTabStripError.CurrentIndexIsGreaterThanChildsCount
}
if let color = child.childHeaderForPagerTabStripViewController(self).color{
segmentedControl.tintColor = color
}
segmentedControl.selectedSegmentIndex = min(currentIndex, viewControllers.count - 1)
}
}
// MARK: - UIScrollViewDelegate
public override func scrollViewDidEndScrollingAnimation(scrollView: UIScrollView) {