Отключить пользовательские свайпы только в определенном направлении на UIPageViewController? - PullRequest
0 голосов
/ 04 октября 2018

У меня проблемы с UITableviewController, встроенным в UIPageViewController… система не может различить пролистывание влево для изменения страниц и пролистывание для удаления элемента в UITableView.Этот конкретный UITableViewController находится на последней странице PageViewController, так что смахивание влево на самом деле ничего не делает (ничего вправо), я могу отключить PageViewController от обнаружения пролистываний, когда текущая страница == 3.хочу игнорировать пролистывания влево (чтобы tableView считывал пролистывание влево как пролистывание для удаления), тогда как я все еще хочу обнаруживать пролистывание вправо, чтобы пользователь мог вернуться к странице 2.

UIPageViewControllerкод:

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]
    }

}

enter image description here

1 Ответ

0 голосов
/ 05 октября 2018

Попробуйте это

func manegePageControllerBounces(isEnable : Bool) {

    for view in pageViewController.view.subviews {

        if view is UIScrollView {
            let scrollView = view as? UIScrollView
            scrollView?.bounces = isEnable
        }
    }

}

Переключение отказов в соответствии с требованием

self.manegePageControllerBounces (isEnable:false)

Надеюсь, это поможет вам ....

...