【问题标题】:How to stop the bounce of UIScrollView at first and last index using UIPageViewController?如何使用 UIPageViewController 在第一个和最后一个索引处停止 UIScrollView 的反弹?
【发布时间】:2017-06-18 07:12:21
【问题描述】:

我有一个 UIViewController,我通过编程方式添加了 UIPageViewController。如果我们处于 0 索引或最后一个索引,如何停止反弹(滚动)UIViewController?我的意思是弹跳。

您可以查看此链接:How to create PageView with UITabBar or Segment Control using swift?

这是我的代码:

import UIKit

class ViewController: UIViewController {

fileprivate var pageViewController:UIPageViewController!
@IBOutlet weak var paginationView:UIView!
@IBOutlet var btnYourGroup: UIButton!
@IBOutlet var btnSharedBy: UIButton!
@IBOutlet var sliderViewLeadingConst: NSLayoutConstraint!

fileprivate var selectedIndex : Int? {
    didSet {
        var leading:CGFloat = 0
        if selectedIndex == 0 {
            leading = 0
        }
        else {
            leading = self.view.frame.size.width/2
        }

        self.sliderViewLeadingConst.constant = leading

        UIView.animate(withDuration: 0.2, animations: {

            self.view.layoutIfNeeded()
        })
    }
}

override func viewDidLoad() {
    super.viewDidLoad()

    //SetUp Pagination
    setupPagination()

    for view in self.pageViewController.view.subviews {
        if let scrollView = view as? UIScrollView {
            scrollView.delegate = self
            break
        }
    }

    //btnSharedBy.titleColor(for: UIControlState)
    btnSharedBy.setTitleColor(UIColor.lightGray, for: UIControlState())
}

private func setupPagination() {

    let startVC = self.viewControllerAtIndex(index: 0)
    let vc = [startVC]
    self.pageViewController = UIPageViewController(transitionStyle: .scroll, navigationOrientation: .horizontal, options: nil)
    self.pageViewController.setViewControllers(vc, direction: .reverse, animated: true, completion: nil)
    self.pageViewController.dataSource = self
    self.pageViewController.delegate = self
    self.pageViewController.view.frame.size = self.paginationView.frame.size
    self.paginationView.addSubview(self.pageViewController.view)
}

@IBAction func mainCateogryTapped(sender:UIButton) {
    loadNextController(index:sender.tag)
}

fileprivate func viewControllerAtIndex(index:Int) -> PageContentViewController {

    let feedsVC = self.storyboard?.instantiateViewController(withIdentifier: "PageContentViewController") as! PageContentViewController
    feedsVC.pageIndex = index
    return feedsVC
}

fileprivate func loadNextController(index:Int) {

    if selectedIndex == index {
        return
    }

    let nextViewController = viewControllerAtIndex(index:index)
    selectedIndex = index

    if index == 0 {
        btnSharedBy.setTitleColor(UIColor.lightGray, for: UIControlState())
        btnYourGroup.setTitleColor(UIColor.white, for: UIControlState())
        self.pageViewController?.setViewControllers([nextViewController], direction: UIPageViewControllerNavigationDirection.reverse, animated: true, completion: nil)
    } else if index == 1 {
        btnSharedBy.setTitleColor(UIColor.white, for: UIControlState())
        btnYourGroup.setTitleColor(UIColor.lightGray, for: UIControlState())
        self.pageViewController?.setViewControllers([nextViewController], direction: UIPageViewControllerNavigationDirection.forward, animated: true, completion: nil)
    }

    else {

    }
  }
}
extension ViewController: UIPageViewControllerDataSource {

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

    var index = (viewController as! PageContentViewController).pageIndex

    if index == 0 {
        return nil
    }
    index = index - 1
    return viewControllerAtIndex(index:index)

}

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

    var index = (viewController as! PageContentViewController).pageIndex

    index = index + 1
    if index == 2 {
        //self.pageViewController.
        return nil
    }
    return viewControllerAtIndex(index:index)
}

func pageViewController(_ pageViewController: UIPageViewController, willTransitionTo pendingViewControllers: [UIViewController]) {

    let vc : PageContentViewController = pendingViewControllers[0] as! PageContentViewController
    selectedIndex = vc.pageIndex
  }
}

extension ViewController : UIPageViewControllerDelegate {

func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {
    if completed {
        let vc = previousViewControllers.first as! PageContentViewController

        if 0 == vc.pageIndex {
            selectedIndex = 1
            btnSharedBy.setTitleColor(UIColor.white, for: UIControlState())
            btnYourGroup.setTitleColor(UIColor.lightGray, for: UIControlState())

        }

        else {
            btnYourGroup.setTitleColor(UIColor.white, for: UIControlState())
            btnSharedBy.setTitleColor(UIColor.lightGray, for: UIControlState())
            selectedIndex = 0
        }
    }

    else if !completed {
        let pageContentView = previousViewControllers[0] as! PageContentViewController;
        self.selectedIndex = pageContentView.pageIndex
    }
  }
}

//ScrollView Delegate
extension ViewController : UIScrollViewDelegate {

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    let point = scrollView.contentOffset
    var percentComplete: CGFloat
    percentComplete = fabs(point.x - view.frame.size.width)/view.frame.size.width
    //NSLog("percentComplete: %f", percentComplete)

        if(0.8 > percentComplete)
        {
            //selectedIndex = 1
            scrollView.bounces = false
        }

        else
        {
            scrollView.bounces = true

        }
    }
}

如何在第一个和最后一个索引处也使用按钮指示器停止弹跳问题?

【问题讨论】:

  • 为什么要停止从第一个和最后一个索引反弹?这对你来说有什么逻辑?弹跳效果只发生在第一个和最后一个索引上,这就是弹跳。
  • 我的要求是不想反弹。谢谢
  • 我试过了,但没有醒。谢谢
  • "not woking" 非常无用。如果您正在寻求帮助,您需要清楚并描述您的代码现在正在做什么,包括用户体验以及您收到的任何崩溃或错误消息。

标签: ios swift uiscrollview uipageviewcontroller bounce


【解决方案1】:

您也许可以遍历页面视图控制器的子视图,寻找它的滚动视图,并将反弹设置为 false。然而,这是一个脆弱的解决方案,并且不明智。 (弄乱视图控制器的视图通常是个坏主意,尤其是在没有公共接口可以找到它们的情况下。)

下面的线程具有遍历页面视图控制器的子视图并找到滚动视图的代码。修改该代码以将 bounces 属性设置为 false 会很容易:

Progress of UIPageViewController

【讨论】:

  • 好的,谢谢,我会试试这个。但是,如果您能看到我的代码并告诉我必须更改的地方,那就更好了。谢谢
  • 将我建议的更改放在 viewDidLoad 中。我不会为你写的。我为您找到了找到滚动视图的代码的链接。修改该代码以将滚动视图的反弹属性更改为 false 应该很简单。
  • 好的,我会检查的。谢谢
  • 如果我们按下按钮并滚动视图,它会失败。我们怎么能停下来请帮忙。谢谢
  • “它失败了”根本没有帮助。从用户的角度以及您在 Xcode 中看到的内容具体说明会发生什么,否则我们无法帮助您。您还需要更新您的问题以在末尾附加您的新代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-14
  • 2016-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多