首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >禁用用户只在UIPageViewController上按特定方向滑动?

禁用用户只在UIPageViewController上按特定方向滑动?
EN

Stack Overflow用户
提问于 2018-10-04 20:42:40
回答 1查看 773关注 0票数 0

我在UIPageViewController…中嵌入一个…时遇到了问题系统无法区分左转以更改页面和滑动以删除UITableView中的项。这个特定的UITableViewController恰好位于PageViewController的最后一页,因此,由于滑动左侧并不能真正做任何事情(在右边没有任何事情),所以当当前页面== 3时,我可以禁止PageViewController检测到滑动。最棘手的部分是,我只想忽略向左的滑动(这样tableView就会将左击读取为要删除的滑动),而我仍然希望检测到向右滑动,这样用户就可以导航回第2页。

UIPageViewController代码:

代码语言:javascript
复制
class WorkoutPageViewController: UIPageViewController, UIPageViewControllerDelegate, UIPageViewControllerDataSource {


    //var pageControl = UIPageControl()
    var referenceToNewWorkoutKingVC: NewWorkoutKingViewController?


    // MARK: UIPageViewControllerDataSource

    lazy var orderedViewControllers: [UIViewController] = {

        var viewControllers = [UIViewController]()

        if referenceToNewWorkoutKingVC?.sessionType == goalieSessionString || referenceToNewWorkoutKingVC?.sessionType == refSessionString || referenceToNewWorkoutKingVC?.sessionType == coachSessionString || referenceToNewWorkoutKingVC?.sessionType == openSkateSessionString {

            viewControllers = [self.newVc(viewController: "NewIceDataTableViewController"),
                               self.newVc(viewController: "NewHealthDataTableViewController")]

        } else {
            viewControllers = [self.newVc(viewController: "NewIceDataTableViewController"),
                               self.newVc(viewController: "NewHealthDataTableViewController"),
                               self.newVc(viewController: "NewShiftTableViewController")]

        }


       return viewControllers
    }()

     let impact = UIImpactFeedbackGenerator(style: UIImpactFeedbackGenerator.FeedbackStyle.medium)

    override func viewDidLoad() {
        super.viewDidLoad()
        self.dataSource = self
        self.delegate = self


        // This sets up the first view that will show up on our page control
        if let firstViewController = orderedViewControllers.first {
            setViewControllers([firstViewController],
                               direction: .forward,
                               animated: true,
                               completion: nil)
        }

    }



    func newVc(viewController: String) -> UIViewController {
        return UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: viewController)
    }




    // MARK: Delegate methods
    func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {
        let pageContentViewController = pageViewController.viewControllers![0]
        referenceToNewWorkoutKingVC?.pageControl.numberOfPages = orderedViewControllers.count
        referenceToNewWorkoutKingVC?.pageControl.currentPage = orderedViewControllers.index(of: pageContentViewController)!


    }

    func pageViewController(_ pageViewController: UIPageViewController, willTransitionTo pendingViewControllers: [UIViewController]) {
        //Haptic when pages switch, code from: https://www.hackingwithswift.com/example-code/uikit/how-to-generate-haptic-feedback-with-uifeedbackgenerator
        impact.prepare()
        impact.impactOccurred()
    }

    // MARK: Data source functions.
    func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
        guard let viewControllerIndex = orderedViewControllers.index(of: viewController) else {
            return nil
        }

        let previousIndex = viewControllerIndex - 1

        // User is on the first view controller and swiped left to loop to
        // the last view controller.
        guard previousIndex >= 0 else {
            //return orderedViewControllers.last
            // Uncommment the line below, remove the line above if you don't want the page control to loop.
            return nil
        }

        guard orderedViewControllers.count > previousIndex else {
            return nil
        }

        return orderedViewControllers[previousIndex]
    }

    func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
        guard let viewControllerIndex = orderedViewControllers.index(of: viewController) else {
            return nil
        }

        let nextIndex = viewControllerIndex + 1
        let orderedViewControllersCount = orderedViewControllers.count

        // User is on the last view controller and swiped right to loop to
        // the first view controller.
        guard orderedViewControllersCount != nextIndex else {
            //return orderedViewControllers.first
            // Uncomment the line below, remove the line above if you don't want the page control to loop.
            return nil
        }

        guard orderedViewControllersCount > nextIndex else {
            return nil
        }

        return orderedViewControllers[nextIndex]
    }

}

EN

回答 1

Stack Overflow用户

发布于 2018-10-05 05:15:56

尝尝这个

代码语言:javascript
复制
func managePageControllerBounces(isEnable : Bool) {

    for view in pageViewController.view.subviews {
    
        if view is UIScrollView {
            let scrollView = view as? UIScrollView
            scrollView?.bounces = isEnable
        }
    }
}

按要求弹跳

self.manegePageControllerBounces(isEnable: false)

希望这对你有帮助..。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52654857

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档