2016-10-31 6 views
1

Ich habe zwei Labels über meiner UICollection und ich muss animieren, wenn ich in der Sammlungsansicht scrollen muss. Grundsätzlich gibt der Benutzer das Gefühl, dass der Bildschirm eine große scrollfähige Ansicht ist.Animieren von NSLayoutConstraint beim Scrollen einer UICollectionView

Meine Ansicht sieht wie folgt in Interface Builder:

enter image description here

Ich habe mit dem folgenden Code kommen, um es auf den kleineren Bildschirmen besser aussehen, aber es gibt mir nicht die Wirkung Ich mag:

func scrollViewWillEndDragging(scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) { 
    if(velocity.y>0){ 
     if Device.IS_3_5_INCHES() { 
      self.topConstraint.constant = -100 
     } 
     if Device.IS_4_INCHES() { 
      self.topConstraint.constant = -70 
     } 
     if Device.IS_4_7_INCHES() { 
      self.topConstraint.constant = 0 
     } 
     if Device.IS_5_5_INCHES() { 
      self.topConstraint.constant = 0 
     } 
    }else{ 
     self.topConstraint.constant = 50 
    } 
} 

das Problem mit diesem Code ist, dass der Bildschirm jetzt ‚springt‘ um statt belebtem, als ob es in dem Teil der Sammlung Ansicht.

Das andere Problem mit diesem Code, dass es zurückspringt, sobald Sie in die andere Richtung scrollen. Egal, ob Sie sich oben oder unten im UIScrollView befinden. Das Zurücksetzen der TopConstraint auf 50 sollte nur dann glücklich sein, wenn Sie oben sind.

+0

Könnten Sie möglicherweise Sammlungsansicht Header als Alternative verwenden? – Danoram

+0

warum nicht einfach die ersten 2 Zellen die ganze Reihe aufnehmen und das Etikett in jede Zelle setzen? – JustinM

+0

Ich bin offen für alles. Verschwinden die Header beim Scrollen? –

Antwort

1

Hier ist, wie Sie die ersten beiden Zellen setzen kann die Breite der Sammlung Ansicht zu sein:

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { 

let insets = collectionView.contentInset 
let collectionViewWidth = collectionView.frame.width - (insets.left + insets.right + 1) 
let collectionViewHeight = collectionView.frame.height - (insets.top + insets.bottom) 

    switch indexPath.row { 
    case 0, 1: 

    return CGSize(width: collectionViewWidth, height: collectionViewHeight/8) 

     default: 
    return CGSize(width: collectionViewWidth/3, height: collectionViewHeight/8) 
    } 
} 

Sie können ändern, wie viel Sie Höhe teilen, indem er das gewünschte Verhältnis zu erhalten. Gleiches mit dem Standard. Also sagen Sie, Sie wollten alle Zellen nach den ersten 2 zu 3 pro Zeile würden Sie teilen collectionViewWidth/3

Dann können Sie eine andere Sammlung anzeigen Zelle Unterklasse, um die ersten beiden Zellen und in CellForItemAtIndexPath, die Sie überprüfen würden, zu sehen welchen IndexPfad ist es und setzen Sie Ihre Zelle entsprechend.

+0

Es funktioniert, großartig! Danke für den Tipp. –

+0

sicher, willkommen! – JustinM

Verwandte Themen