UIScrollView嵌套在UIPageViewController幻灯片中

问题描述 投票:1回答:1

我有一个漂亮的标准UIPageViewController,可以加载3个单独的UIViewController,以进行滑动。

这些UIViewController中的一个需要UIScrollView,该UIScrollView仍可在不触发UIPageViewController的手势识别器的情况下运行。

如果触摸是从那里开始的,那么如何将其限制为UIScrollView,所以它不会触发过渡?

以下是设置图:enter image description here

UIPageViewController源:

class MyPageViewController: UIPageViewController
{
    fileprivate lazy var pages: [UIViewController] = {
        return [
            self.getViewController(withIdentifier: "MyPage1"),
            self.getViewController(withIdentifier: "MyPage2"),
            self.getViewController(withIdentifier: "MyPage3"),
        ]
    }()

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

    var imageView: UIImageView?
    var backgroundVideo : VideoBackground!

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

        if let firstVC = pages.first
        {
            setViewControllers([firstVC], direction: .forward, animated: true, completion: nil)
        }
    }

}

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

        guard let viewControllerIndex = pages.index(of: viewController) else { return nil }

        let previousIndex = viewControllerIndex - 1

        guard previousIndex >= 0 else { return nil        }

        guard pages.count > previousIndex else { return nil        }

        return pages[previousIndex]
    }

    func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController?
    {
        guard let viewControllerIndex = pages.index(of: viewController) else { return nil }
        let nextIndex = viewControllerIndex + 1
        guard nextIndex < pages.count else { return nil        }
        guard pages.count > nextIndex else { return nil         }
        return pages[nextIndex]
    }

    private func setupPageControl() {
        let appearance = UIPageControl.appearance()
        appearance.pageIndicatorTintColor = UIColor.black
        appearance.currentPageIndicatorTintColor = UIColor.white
        appearance.backgroundColor = UIColor.clear
        appearance.isOpaque = false
    }

    func presentationCount(for pageViewController: UIPageViewController) -> Int {
        setupPageControl()
        return self.pages.count
    }

    func presentationIndex(for pageViewController: UIPageViewController) -> Int {
        return 0
    }

    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        for view in self.view.subviews {
            if view is UIScrollView {
                view.frame = UIScreen.main.bounds
            } else if view is UIPageControl {
                view.backgroundColor = UIColor.clear
            }
        }
    }

}

extension MyPageViewController: UIPageViewControllerDelegate {}
ios swift uigesturerecognizer
1个回答
0
投票

如果scrollView的标准属性(例如,延迟页面控制器中的触摸不起作用,但我认为应该这样做,scrollView内的scrollView通常可以正常工作,则可以始终覆盖hitTest方法并用它来决定哪个scrollViews应该接受触摸。只需检查CGPoint是否在内部滚动视图中,如果是,则返回该scrollView,否则返回您的超级视图。

© www.soinside.com 2019 - 2024. All rights reserved.