Je cherche un moyen de remplacer la pagination horizontale native UIPageViewController
par une UICollectionView
.
jusqu'à présent, j'ai fait ce qui suit:
let layout = UICollectionViewFlowLayout()
layout.scrollDirection = .horizontal
layout.itemSize = collectionView.frame.size
layout.minimumLineSpacing = 0
layout.minimumInteritemSpacing = 10
collectionView.setCollectionViewLayout(layout, animated: false)
collectionView.isPagingEnabled = true
collectionView.alwaysBounceVertical = false
cela fonctionne bien et j'obtiens un effet de pagination horizontale.
Maintenant, je veux ajouter un espace horizontal entre les pages (comme vous le ferez avec UIPageViewControllerOptionInterPageSpacingKey
sur UIPageViewController
)
jusqu'à présent, je n'ai pas pu trouver un moyen d'ajouter des espaces sans endommager l'effet de pagination. im recherche le même comportement qu'avec UIPageViewController
: la cellule doit remplir toute la largeur de l'écran et l'espace entre les cellules ne doit être visible que lors du changement de page.
Première solution:
collectionView.isPagingEnabled = false
minimumLineSpacing
pour la distance entre les pagestargetContentOffsetForProposedContentOffset:withScrollingVelocity:
pour déplacer le contentOffset vers la page la plus proche. Vous pouvez calculer la page avec des mathématiques simples en fonction de vos itemSize
et minimumLineSpacing
, mais cela peut prendre un peu de travail pour bien faire les choses.Deuxième solution:
collectionView.isPagingEnabled = true
minimumLineSpacing
pour la distance entre les pagesminimumLineSpacing
de 10, définissez le cadre de la collectionView sur {0, -5, largeur + 10, hauteur}minimumLineSpacing
pour que le premier et le dernier élément apparaissent correctement.Voici le code écrit en Swift 3.1, je suis sûr qu'il comprend facilement pour vous:
let pageSpacing: CGFloat = 10
class ViewController: UITableViewController {
override func viewDidLoad() {
super.viewDidLoad()
let layout = UICollectionViewFlowLayout()
layout.itemSize = CGSize(width: view.frame.width + pageSpacing, height: view.frame.height)
layout.scrollDirection = .horizontal
layout.minimumInteritemSpacing = 0
layout.minimumLineSpacing = 0
let frame = CGRect(x: 0, y: 0, width: view.frame.width + pageSpacing, height: view.frame.height)
let collectionView = UICollectionView(frame: frame, collectionViewLayout: layout)
view.addSubview(collectionView)
}
}
class MyCell: UICollectionViewCell {
var fullScreenImageView = UIImageView()
override func layoutSubviews() {
super.layoutSubviews()
fullScreenImageView.frame = CGRect(x: 0, y: 0, width: frame.width - pageSpacing, height: frame.height)
}
}
J'espère que cela peut vous aider.