Ну, это немного сбивает с толку.У меня есть это требование, чтобы сделать приложение, которое имеет 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)
}
}
}