2017-02-01 3 views
1

J'ai un UIViewController et j'ai ajouté UIPageViewController par programme. Comment arrêter le rebond (défilement) du UIViewController si nous sommes à l'index 0 ou au dernier index? Je veux dire rebondir.Comment arrêter le rebond de UIScrollView au premier et dernier index en utilisant UIPageViewController?

Vous pouvez vérifier ce lien: How to create PageView with UITabBar or Segment Control using swift?

Et voici mon code:

import UIKit 

class ViewController: UIViewController { 

fileprivate var pageViewController:UIPageViewController! 
@IBOutlet weak var paginationView:UIView! 
@IBOutlet var btnYourGroup: UIButton! 
@IBOutlet var btnSharedBy: UIButton! 
@IBOutlet var sliderViewLeadingConst: NSLayoutConstraint! 

fileprivate var selectedIndex : Int? { 
    didSet { 
     var leading:CGFloat = 0 
     if selectedIndex == 0 { 
      leading = 0 
     } 
     else { 
      leading = self.view.frame.size.width/2 
     } 

     self.sliderViewLeadingConst.constant = leading 

     UIView.animate(withDuration: 0.2, animations: { 

      self.view.layoutIfNeeded() 
     }) 
    } 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 

    //SetUp Pagination 
    setupPagination() 

    for view in self.pageViewController.view.subviews { 
     if let scrollView = view as? UIScrollView { 
      scrollView.delegate = self 
      break 
     } 
    } 

    //btnSharedBy.titleColor(for: UIControlState) 
    btnSharedBy.setTitleColor(UIColor.lightGray, for: UIControlState()) 
} 

private func setupPagination() { 

    let startVC = self.viewControllerAtIndex(index: 0) 
    let vc = [startVC] 
    self.pageViewController = UIPageViewController(transitionStyle: .scroll, navigationOrientation: .horizontal, options: nil) 
    self.pageViewController.setViewControllers(vc, direction: .reverse, animated: true, completion: nil) 
    self.pageViewController.dataSource = self 
    self.pageViewController.delegate = self 
    self.pageViewController.view.frame.size = self.paginationView.frame.size 
    self.paginationView.addSubview(self.pageViewController.view) 
} 

@IBAction func mainCateogryTapped(sender:UIButton) { 
    loadNextController(index:sender.tag) 
} 

fileprivate func viewControllerAtIndex(index:Int) -> PageContentViewController { 

    let feedsVC = self.storyboard?.instantiateViewController(withIdentifier: "PageContentViewController") as! PageContentViewController 
    feedsVC.pageIndex = index 
    return feedsVC 
} 

fileprivate func loadNextController(index:Int) { 

    if selectedIndex == index { 
     return 
    } 

    let nextViewController = viewControllerAtIndex(index:index) 
    selectedIndex = index 

    if index == 0 { 
     btnSharedBy.setTitleColor(UIColor.lightGray, for: UIControlState()) 
     btnYourGroup.setTitleColor(UIColor.white, for: UIControlState()) 
     self.pageViewController?.setViewControllers([nextViewController], direction: UIPageViewControllerNavigationDirection.reverse, animated: true, completion: nil) 
    } else if index == 1 { 
     btnSharedBy.setTitleColor(UIColor.white, for: UIControlState()) 
     btnYourGroup.setTitleColor(UIColor.lightGray, for: UIControlState()) 
     self.pageViewController?.setViewControllers([nextViewController], direction: UIPageViewControllerNavigationDirection.forward, animated: true, completion: nil) 
    } 

    else { 

    } 
    } 
} 
extension ViewController: UIPageViewControllerDataSource { 

func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? { 

    var index = (viewController as! PageContentViewController).pageIndex 

    if index == 0 { 
     return nil 
    } 
    index = index - 1 
    return viewControllerAtIndex(index:index) 

} 

func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? { 

    var index = (viewController as! PageContentViewController).pageIndex 

    index = index + 1 
    if index == 2 { 
     //self.pageViewController. 
     return nil 
    } 
    return viewControllerAtIndex(index:index) 
} 

func pageViewController(_ pageViewController: UIPageViewController, willTransitionTo pendingViewControllers: [UIViewController]) { 

    let vc : PageContentViewController = pendingViewControllers[0] as! PageContentViewController 
    selectedIndex = vc.pageIndex 
    } 
} 

extension ViewController : UIPageViewControllerDelegate { 

func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) { 
    if completed { 
     let vc = previousViewControllers.first as! PageContentViewController 

     if 0 == vc.pageIndex { 
      selectedIndex = 1 
      btnSharedBy.setTitleColor(UIColor.white, for: UIControlState()) 
      btnYourGroup.setTitleColor(UIColor.lightGray, for: UIControlState()) 

     } 

     else { 
      btnYourGroup.setTitleColor(UIColor.white, for: UIControlState()) 
      btnSharedBy.setTitleColor(UIColor.lightGray, for: UIControlState()) 
      selectedIndex = 0 
     } 
    } 

    else if !completed { 
     let pageContentView = previousViewControllers[0] as! PageContentViewController; 
     self.selectedIndex = pageContentView.pageIndex 
    } 
    } 
} 

//ScrollView Delegate 
extension ViewController : UIScrollViewDelegate { 

func scrollViewDidScroll(_ scrollView: UIScrollView) { 
    let point = scrollView.contentOffset 
    var percentComplete: CGFloat 
    percentComplete = fabs(point.x - view.frame.size.width)/view.frame.size.width 
    //NSLog("percentComplete: %f", percentComplete) 

     if(0.8 > percentComplete) 
     { 
      //selectedIndex = 1 
      scrollView.bounces = false 
     } 

     else 
     { 
      scrollView.bounces = true 

     } 
    } 
} 

Comment puis-je arrêter problème rebondir au premier et dernier indice avec indicateur de touche aussi?

+0

Pourquoi voudriez-vous arrêter le rebond du premier et dernier indice? Comment cela est-il logique pour vous? L'effet de rebond SE produit SEULEMENT sur le premier et le dernier index, c'est ce que le rebond est. –

+0

Mon exigence est comme je ne veux pas rebondir. Merci – kishor0011

+0

http://stackoverflow.com/questions/21798218/disable-uipageviewcontroller-bounce vérifier ici –

Répondre

2

Vous pouvez parcourir les sous-vues du contrôleur de vue de page, en recherchant la vue de défilement et définir les rebonds sur faux. Ceci est cependant une solution fragile et mal conseillée. (Il est généralement une mauvaise idée de manipuler les vues d'un contrôleur de vue, surtout s'il n'y a pas d'interface publique pour les trouver.)

Le fil ci-dessous contient du code qui parcourt les sous-vues d'un contrôleur de page et trouve la vue déroulante. Il serait facile d'adapter ce code pour définir la propriété bounces false:

Progress of UIPageViewController

+0

OK Merci, je vais essayer ça. Mais ce serait mieux si vous pouvez voir mon code une fois et me dire où je dois changer. Merci – kishor0011

+0

Mettez les modifications suggérées dans viewDidLoad. Je ne vais pas l'écrire pour toi. Je vous ai trouvé un lien vers le code qui trouve la vue déroulante. Il devrait être simple d'adapter ce code pour changer la propriété bounces de la vue scroll à false. –

+0

Ok, je vais vérifier. Merci – kishor0011