2015-06-21 14 views
6

Ich habe eine Beispiel-App mit Scrollen zwischen UIViewControllers gemacht, aber der Punkt ist, ich möchte den Bounce-Effekt am Ende des Scrollens und beim Zurückgehen auf die erste UIViewController deaktivieren.Disable UIPageViewController Bouncing - Swift

hier ist mein Code:

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) 

    } 

} 

Werfen Sie einen Blick hier:

enter image description here

Antwort

5

Ich weiß nicht, wenn Sie können. UIPageController ist nicht sehr anpassbar.

Persönlich, wenn ich zwischen UIViewController scrollen möchte, bevorzuge ich einen einfachen UIViewController, der ein Container sein wird, mit einem UIScrollView darin. Dann füge ich programmatisch alle Controller in der contentSize von UIScrollView hinzu. Sie müssen alle Controller als untergeordnetes Element des Containers hinzufügen.

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 
} 

vorherige Antwort

wie folgt:

Scroll ist ein IBOutlet mit contraints zu jeder Kante des 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

gibt es eine andere mögliche Lösung, ohne 'UIScrollView' anstelle von' UIPageViewController' zu verwenden? oder wie ist es möglich nur horizontales scrollen zu erlauben? – AaoIi

+0

Ihre scrollView sollte nicht vertikal scrollen, da die Höhe Ihrer contentSize gleich der Höhe Ihrer scrollView ist. –

+0

in Ihrer Weise, wie kann ich überprüfen, dass ich jetzt in ViewController2 bin? – AaoIi

Verwandte Themen