Créer une Pagination UICollectionView avec Swift
Je suis en train de créer un UICollectionView avec la pagination et que chaque élément de la largeur maximale est de 250 points, j'ai réussi à le créer, mais j'ai 2 problèmes: Le premier élément de départ et non pas comme il devrait l'être, mais avec plus d'espace au début et quand j'essaie de glisser, il y a toujours quelque chose qui ne me laissera pas de balayage en douceur.
C'est à quoi il ressemble:
C'est mon code:
CenterCellCollectionFlowLayout.swift
class CenterCellCollectionViewFlowLayout: UICollectionViewFlowLayout {
override func layoutAttributesForElementsInRect(rect: CGRect) -> [AnyObject]? {
var attributesToReturn:[UICollectionViewLayoutAttributes] = super.layoutAttributesForElementsInRect(rect) as! [UICollectionViewLayoutAttributes]
for var i = 0 ; i < attributesToReturn.count ; i++
{
var currentLayoutAttributes: UICollectionViewLayoutAttributes = attributesToReturn[i]
var maximumSpacing: CGFloat = 50
let origin: CGFloat
if i - 1 >= 0 {
let previousLayoutAttributes = attributesToReturn[i - 1]
origin = previousLayoutAttributes.frame.maxX
} else {
origin = 0
}
if origin + maximumSpacing + currentLayoutAttributes.frame.size.width < self.collectionViewContentSize().width
{
var frame: CGRect = currentLayoutAttributes.frame
frame.origin.x = origin + maximumSpacing
currentLayoutAttributes.frame = frame
}
}
return attributesToReturn
}
override func targetContentOffsetForProposedContentOffset(proposedContentOffset: CGPoint, withScrollingVelocity velocity: CGPoint) -> CGPoint {
if let cv = self.collectionView {
let cvBounds = cv.bounds
let halfWidth = cvBounds.size.width * 0.5;
let proposedContentOffsetCenterX = proposedContentOffset.x + halfWidth;
if let attributesForVisibleCells = self.layoutAttributesForElementsInRect(cvBounds) as? [UICollectionViewLayoutAttributes] {
var candidateAttributes : UICollectionViewLayoutAttributes?
for attributes in attributesForVisibleCells {
//== Skip comparison with non-cell items (headers and footers) == //
if attributes.representedElementCategory != UICollectionElementCategory.Cell {
continue
}
if let candAttrs = candidateAttributes {
let a = attributes.center.x - proposedContentOffsetCenterX
let b = candAttrs.center.x - proposedContentOffsetCenterX
if fabsf(Float(a)) < fabsf(Float(b)) {
candidateAttributes = attributes;
}
}
else { //== First time in the loop == //
candidateAttributes = attributes;
continue;
}
}
return CGPoint(x : candidateAttributes!.center.x - halfWidth, y : proposedContentOffset.y);
}
}
//Fallback
return super.targetContentOffsetForProposedContentOffset(proposedContentOffset)
}
}
MainViewController.swift
class MainViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {
@IBOutlet weak var collectionView: UICollectionView!
@IBOutlet weak var collectionViewFlowLayout: CenterCellCollectionViewFlowLayout!
var collectionObjects: NSMutableArray?
private let reuseIdentifier = "CollectionViewCell"
override func viewDidLoad() {
super.viewDidLoad()
//Do any additional setup after loading the view.
self.collectionView.registerClass(UICollectionViewCell.self, forCellWithReuseIdentifier: reuseIdentifier)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
//Dispose of any resources that can be recreated.
}
func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath)
{
}
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell
{
let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as! UICollectionViewCell
cell.backgroundColor = UIColor.greenColor()
//Configure the cell
return cell
}
func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int
{
return 10
}
func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAtIndex section: Int) -> UIEdgeInsets
{
return UIEdgeInsetsMake(0, 0, 0, 0)
}
func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize
{
return CGSizeMake(250, 250)
}
}
Merci d'avance
OriginalL'auteur Yossi Tsafar | 2015-07-11
Vous devez vous connecter pour publier un commentaire.
Donc j'ai trouver comment faire.
D'abord créer un personnalisé UICollectionViewFlowLayout et ajouter cette substitution de cette méthode:
Puis sur la classe que vous mettre en œuvre la UICollectionView faire comme ça:
Qui est sur elle, fonctionne comme un charme.
blog.karmadust.com/...
Ce code fonctionne mieux pour moi que le karmadust un
Travailler comme un charme!
J'aimerais donner de crédit, mais les deux sites ne fonctionnent pas. De toute façon, je voulais juste aider les gens, de ne pas voler quelqu'un de code.
OriginalL'auteur Yossi Tsafar
Un UICollectionView hérite de UIScrollView. Il est possible d'atteindre la pagination par la mise en isPagingEnabled de vrai.
OriginalL'auteur chrisoneiota