2017-04-10 3 views
0

Ich möchten eine Sammlung Ansicht wie diese bauen: Collection ViewiOS Swift 3: UICollectionView horizontale Mitte und größere Zelle

, die in der Mitte größer Zelle und Zelle wird zum Zentrum des Behälters Ansicht geschnappt, aber mit Swift 3. Ich möchte keine Bibliothek verwenden, da ich lernen möchte, wie man eine benutzerdefinierte Collection-Ansicht erstellt.

Ich habe über SO gesucht, aber nicht gefunden jede geeignete Lösung noch

+2

Hallo, Überprüfen Sie den Link und wählen, wenn es hilft. https://github.com/ink-spot/UPCarouselFlowLayout –

+0

Das funktioniert super, wie kann ich diese Antwort akzeptieren? –

+0

Wählen Sie einfach durch Drücken der Taste über Flag, Sie können beide finden, indem Sie den Mauszeiger auf meine Antwort bewegen. Vielen Dank. –

Antwort

0

schreiben, die

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

make Sammlung Ansicht [Scroll-Richtung] Horizontale

und [Scrollen] funktioniert tick Scrollen ermöglichen und Paging aktivieren

machen Zelle biger

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { 

    let offSet = self.collectionView.contentOffset 
    let width = self.collectionView.bounds.size.width 

    let index = round(offSet.x/width) 
    let newPoint = CGPoint(x: index * size.width, y: offSet.y) 


    coordinator.animate(alongsideTransition: { (UIViewControllerTransitionCoordinatorContext) in 

    },completion: {(UIVIewTransitionCoordinatorContext) in 
     self.collectionView.reloadData() 
     self.collectionView.setContentOffset(newPoint, animated: true) 
    }) 

} 
+0

Wie mache ich eine mittlere Zelle größer als linke & rechte Zellen? –

0

Um dies zu erreichen, müssen Sie UICollectionViewFlowLayout Unterklasse und überschreiben:

- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath 

dann super.layoutAt nennen ... und verändern die Zelle, um sie über seine .transform Attribut gibt und zurück Ihre geänderten Attribute

Hier ist ein Beispiel, das ich zuvor gemacht habe.

override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? { 

var att = super.layoutAttributesForElements(in: rect)! 

if !(delegate?.reelPlayerFlowIsPreviewMode() ?? true) { 
    return att 
} 
let region = CGRect(x: (self.collectionView?.contentOffset.x)!, 
        y: (self.collectionView?.contentOffset.y)!, 
        width: (self.collectionView?.bounds.size.width)!, 
        height: (self.collectionView?.bounds.size.height)!) 

let center = CGPoint(x: region.midX, y: region.midY) 

for theCell in att { 

    print("\(theCell.indexPath.item)\n\(theCell)\n") 
    let cell = theCell.copy() as! UICollectionViewLayoutAttributes 
    var f = cell.frame 
    let cellCenter = CGPoint(x: f.midX, y: f.midY) 
    let realDistance = min(center.x - cellCenter.x, region.width) 
    let distance = abs(realDistance) 
    let d = (region.width - distance)/region.width 
    let p = (max(d, ReelPlayerFlowLayout.minPercent) * ReelPlayerFlowLayout.maxPercent) 

    f.origin.x += (realDistance * ((1 - ReelPlayerFlowLayout.maxPercent) + (ReelPlayerFlowLayout.maxPercent - ReelPlayerFlowLayout.minPercent))) 

    cell.frame = f 
    cell.size = CGSize (width: f.width * p, height: f.height * p)    
    let index = att.index(of: theCell)! 
    att[index] = cell 
} 

return att 

}

Verwandte Themen