参见英文答案 >
Disable UIPageViewController bounce8个
我一直在制作一个在UIViewControllers之间滚动的示例应用程序,但重点是我想在滚动结束时和返回第一个UIViewController时禁用弹跳效果.
我一直在制作一个在UIViewControllers之间滚动的示例应用程序,但重点是我想在滚动结束时和返回第一个UIViewController时禁用弹跳效果.
这是我的代码:
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) } }
看看这里:
解决方法
我不知道你能不能. UIPageController不是很容易定制的.
就个人而言,当我想在UIViewController之间滚动时,我更喜欢使用一个简单的UIViewController,它将是一个容器,里面有一个UIScrollView.然后我以编程方式添加UIScrollView的contentSize中的所有控制器.您必须将所有控制器添加为容器的子级.
更新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) }}