参见英文答案 >
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)
- }}