2015-06-21 14 views
6

Tôi đã tạo một ứng dụng mẫu có cuộn giữa UIViewControllers nhưng điểm là tôi muốn vô hiệu hiệu ứng nảy ở cuối cuộn và khi quay lại UIViewController đầu tiên.Tắt tính năng UIPageViewController bouncing - Swift

đây là mã của tôi:

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) 

    } 

} 

Hãy xem ở đây:

enter image description here

Trả lời

5

Tôi không biết nếu bạn có thể. UIPageController không phải là rất tùy biến.

Cá nhân, khi tôi muốn cuộn giữa UIViewController, tôi thích sử dụng UIViewController đơn giản, đây sẽ là một vùng chứa, với UIScrollView trong đó. Sau đó, tôi thêm lập trình tất cả các bộ điều khiển trong contentSize của UIScrollView. Bạn phải thêm tất cả các bộ điều khiển dưới dạng con của vùng chứa.

CẬP NHẬT 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 
} 

TRƯỚC ĐÁP

Giống như vậy:

scrollview là một IBOutlet với contraints cho mỗi cạnh của 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

là có bất kỳ giải pháp có thể nào khác mà không sử dụng 'UIScrollView' thay vì' UIPageViewController'? hoặc làm cách nào để chỉ cho phép cuộn ngang? – AaoIi

+0

ScrollView của bạn không được cuộn theo chiều dọc vì chiều cao của contentSize của bạn bằng với chiều cao của scrollView của bạn. –

+0

theo cách của bạn làm thế nào tôi có thể kiểm tra xem tôi đang ở trong viewController2? – AaoIi

Các vấn đề liên quan