2015-06-21 5 views
6

Я делаю пример приложения с прокруткой между UIViewControllers, но я хочу отключить эффект подпрыгивания в конце прокрутки и при возврате к первому UIViewController.Отключить UIPageViewController bouncing - Swift

вот мой код:

class PageViewController: UIPageViewController,UIPageViewControllerDataSource, UIPageViewControllerDelegate{ 

    var index = 0 
    var identifiers: NSArray = ["FirstNavigationController", "SecondNavigationController"] 
    override func viewDidLoad() { 

     self.dataSource = self 
     self.delegate = self 

     let startingViewController = self.viewControllerAtIndex(self.index) 

     let viewControllers: NSArray = [startingViewController] 
     self.setViewControllers(viewControllers as [AnyObject], direction: UIPageViewControllerNavigationDirection.Forward, animated: false, completion: nil) 
    } 

    func viewControllerAtIndex(index: Int) -> UINavigationController! { 

     let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil) 
     //first view controller = firstViewControllers navigation controller 
     if index == 0 { 

      return storyBoard.instantiateViewControllerWithIdentifier("FirstNavigationController") as! UINavigationController 

     } 

     //second view controller = secondViewController's navigation controller 
     if index == 1 { 

      return storyBoard.instantiateViewControllerWithIdentifier("SecondNavigationController") as! UINavigationController 
     } 

     return nil 
    } 
    func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? { 

     let identifier = viewController.restorationIdentifier 
     let index = self.identifiers.indexOfObject(identifier!) 

     //if the index is the end of the array, return nil since we dont want a view controller after the last one 
     if index == identifiers.count - 1 { 

      return nil 
     } 

     //increment the index to get the viewController after the current index 
     self.index = self.index + 1 
     return self.viewControllerAtIndex(self.index) 

    } 

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

     let identifier = viewController.restorationIdentifier 
     let index = self.identifiers.indexOfObject(identifier!) 

     //if the index is 0, return nil since we dont want a view controller before the first one 
     if index == 0 { 

      return nil 
     } 

     //decrement the index to get the viewController before the current one 
     self.index = self.index - 1 
     return self.viewControllerAtIndex(self.index) 

    } 

} 

Посмотрите здесь:

enter image description here

ответ

5

мне делать, если вы не можете знать. UIPageController не очень настраиваемый.

Лично, когда я хочу прокручивать UIViewController, я предпочитаю использовать простой UIViewController, который будет контейнером с UIScrollView в нем. Затем я программно добавляю все контроллеры в contentSize UIScrollView. Вы должны добавить все контроллеры в качестве дочернего элемента контейнера.

UPDATE Ios 9

func setupDetailViewControllers() { 
    var previousController: UIViewController? 
    for controller in self.controllers { 
     addChildViewController(controller) 
     addControllerInContentView(controller, previousController: previousController) 
     controller.didMoveToParentViewController(self) 
     previousController = controller 
    } 
} 

func addControllerInContentView(controller: UIViewController, previousController: UIViewController?) { 
    contentView.addSubview(controller.view) 
    controller.view.translatesAutoresizingMaskIntoConstraints = false 

    // top 
    controller.view.topAnchor.constraintEqualToAnchor(contentView.topAnchor).active = true 

    // bottom 
    controller.view.bottomAnchor.constraintEqualToAnchor(contentView.bottomAnchor).active = true 

    // trailing 
    trailingContentViewConstraint?.active = false 
    trailingContentViewConstraint = controller.view.trailingAnchor.constraintEqualToAnchor(contentView.trailingAnchor) 
    trailingContentViewConstraint?.active = true 

    // leading 
    let leadingAnchor = previousController?.view.trailingAnchor ?? contentView.leadingAnchor 
    controller.view.leadingAnchor.constraintEqualToAnchor(leadingAnchor).active = true 

    // width 
    controller.view.widthAnchor.constraintEqualToAnchor(scrollView.widthAnchor).active = true 
} 

предыдущий ответ

Подобно:

Scrollview представляет собой IBOutlet с контрсилами к каждому краю ContainerViewController

class ContainerViewController: UIViewController { 

@IBOutlet var scrollView: UIScrollView! 

override func viewDidLoad() { 
    super.viewDidLoad() 
    scrollView.bounces = false 
    scrollView.pagingEnabled = true 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 

} 

override func viewDidLayoutSubviews() { 
    initScrollView() 
} 

func initScrollView(){ 
    let viewController1 = storyboard?.instantiateViewControllerWithIdentifier("ViewController1") as! ViewController1 

    viewController1.willMoveToParentViewController(self) 
    viewController1.view.frame = scrollView.bounds 

    let viewController2 = storyboard?.instantiateViewControllerWithIdentifier("ViewController2") as! ViewController2 

    viewController2.willMoveToParentViewController(self) 
    viewController2.view.frame.size = scrollView.frame.size 
    viewController2.view.frame.origin = CGPoint(x: view.frame.width, y: 0) 

    scrollView.contentSize = CGSize(width: 2 * scrollView.frame.width, height: scrollView.frame.height) 

    scrollView.addSubview(viewController2.view) 
    self.addChildViewController(viewController2) 
    viewController2.didMoveToParentViewController(self) 

    scrollView.addSubview(viewController1.view) 
    self.addChildViewController(viewController1) 
    viewController1.didMoveToParentViewController(self) 
}} 
+0

есть ли любое другое возможное решение без использования 'UIScrollView' вместо' UIPageViewController'? или как можно разрешить только горизонтальную прокрутку? – AaoIi

+0

Ваш scrollView не должен прокручиваться по вертикали, так как высота вашего contentSize равна высоте вашего scrollView. –

+0

на вашем пути, как я могу проверить, что я сейчас в viewController2? – AaoIi

Смежные вопросы