UIScrollView внутри UICollectionViewCell внутри UIPageViewController, иметь страницу края прокрутки пейджером - PullRequest
0 голосов
/ 11 июля 2019

Ну, это немного сбивает с толку.У меня есть это требование, чтобы сделать приложение, которое имеет UIPageViewController, который содержит UICollectionView на каждой из страниц.

Каждый UICollectionView содержит ячейку с UIScrollView внутри.

Мне нужно такое поведение: когда пользователь прокручивает ячейку, он прокручивает содержимое, а когда содержимое достигает края, где оно естественно отскакивает, я хочу, чтобы пейджер начал переходить на следующую страницу.

Прямо сейчас происходит следующее: пользователь прокручивает, и когда он достигает края, он просто отскакивает UIScrollView, но не переходит на следующую страницу.

Само собой разумеется, что, когда я устанавливаю размер контента равным размеру самого scrollView (то есть панорамировать нечего), он выполняет страницу.

Я читаю много вопросов, которые пытаются получить что-то похожее, ничегобыли именно мои требования.

Некоторые фрагменты кода

Ячейка, содержащая представление прокрутки:

class ScrollingCell: UICollectionViewCell, UIGestureRecognizerDelegate {

    @IBOutlet weak var scrollView: SpecialScrollView!
    var panGesture : UIPanGestureRecognizer!

    override func awakeFromNib() {
        super.awakeFromNib()
        panGesture = UIPanGestureRecognizer.init(target: self, action: nil)
        addGestureRecognizer(panGesture)
    }

    @objc func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
        return true
    }

}

Затем в UIViewController, которыйделегаты UICollectionView:

class UIColViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout, UIGestureRecognizerDelegate {
var panGesture : UIPanGestureRecognizer!

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return 2
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    if indexPath.row == 0 {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "ScrollingCell", for: indexPath) as! ScrollingCell
        cell.panGesture.delegate = self
        return cell
    }
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "NotScrollCell", for: indexPath) as! NotScrollCell

        return cell

}

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    return CGSize(width: collectionView.frame.width, height: collectionView.frame.height / 2)

}

@IBOutlet weak var collectionView: UICollectionView!
var vcIndex: Int? = nil

override func viewDidLoad() {
    super.viewDidLoad()

    collectionView.register(UINib(nibName: "ScrollingCell", bundle: nil), forCellWithReuseIdentifier: "ScrollingCell")
    collectionView.register(UINib(nibName: "NotScrollCell", bundle: nil), forCellWithReuseIdentifier: "NotScrollCell")

    collectionView.delegate = self
    collectionView.dataSource = self
    collectionView.reloadData()
    panGesture = UIPanGestureRecognizer.init(target: self, action: nil)
    collectionView.addGestureRecognizer(panGesture)
}

@objc func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
    return true
}

}

И, наконец, UIPageViewController:

class PagerViewController: UIPageViewController, UIPageViewControllerDataSource, UIPageViewControllerDelegate, UIGestureRecognizerDelegate  {

@objc func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
    return true
}

let colors: [UIColor] = [
    UIColor.blue,
    UIColor.red,
    UIColor.yellow,
    UIColor.green
]
var vcs: [UIViewController] {
    var vcList: [UIViewController] = []
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    for i in 0...3 {
        let vc = storyboard.instantiateViewController(withIdentifier: "ui")
        (vc as? UIColViewController)?.vcIndex = i
        vc.view.backgroundColor = colors[i]
        (vc as? UIColViewController)?.panGesture.delegate = self
        vcList.append(vc)
    }
    return vcList
}


func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
    guard let viewControllerIndex = (viewController as? UIColViewController)?.vcIndex else { return nil }

    let previousIndex = viewControllerIndex - 1

    guard previousIndex >= 0 else { return vcs.last }

    guard vcs.count > previousIndex else { return nil }

    return vcs[previousIndex]
}

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

    guard let viewControllerIndex = (viewController as? UIColViewController)?.vcIndex else { return nil }

    let nextIndex = viewControllerIndex + 1

    guard nextIndex < vcs.count else { return vcs.first }

    guard vcs.count > nextIndex else { return nil }

    return vcs[nextIndex]
}

override func viewDidLoad() {
    self.delegate = self
    self.dataSource = self
    if let first = vcs.first {
        setViewControllers([first], direction: .forward, animated: true, completion: nil)
    }
}

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...