2014-02-15 7 views
8

In iOS 7, da ein UICollectionView, wie Sie es am unteren Rand beginnen? Denken Sie an die App "iOS-Nachrichten", bei der die Ansicht immer sichtbar wird, wenn sie am unteren Rand angezeigt wird (letzte Nachricht).starten UICollectionView unten

Antwort

2

Das Problem ist, dass, wenn Sie versuchen, in viewWillAppear die Content Ihrer Sammlung Ansicht zu setzen, die Sammlung Ansicht seine Artikel noch nicht gemacht hat. Daher ist self.collectionView.contentSize immer noch {0,0}. Die Lösung besteht darin, das Layout der Sammlungsansicht für die Inhaltsgröße zu fragen.

Zusätzlich sollten Sie sicherstellen, dass Sie nur die Content gesetzt, wenn der Content größer als die Grenzen Ihrer Sammlung Ansicht ist.

Eine vollständige Lösung sieht so aus:

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 

    CGSize contentSize = [self.collectionView.collectionViewLayout collectionViewContentSize]; 
    if (contentSize.height > self.collectionView.bounds.size.height) { 
     CGPoint targetContentOffset = CGPointMake(0.0f, contentSize.height - self.collectionView.bounds.size.height); 
     [self.collectionView setContentOffset:targetContentOffset]; 
    } 
} 
+0

Funktioniert nicht mit dem automatischen Layout. – Chris

0

Unter der Annahme, dass Sie wissen, wie viele Elemente in Ihrer Sammlung Ansicht sind Sie

scrollToItemAtIndexPath:atScrollPosition:animated:

Apple Docs

1
yourCollectionView.contentOffset = CGPointMake(0, yourCollectionView.contentSize.height - yourCollectionView.bounds.size.height); 

Aber denken Sie daran dies nur tun können, wenn Ihr contentSize.height>bounds.size.height.

1

Dies funktioniert für mich, und ich denke, es ist eine moderne Art und Weise ist.

override func viewWillAppear(animated: Bool) { 
    super.viewWillAppear(animated) 
    self.collectionView!.scrollToItemAtIndexPath(indexForTheLast, atScrollPosition: UICollectionViewScrollPosition.Bottom, animated: false) 
} 
2

@awolf Ihre Lösung ist gut! Aber funktionieren nicht gut mit Auto-Layout.

sollten Sie rufen [self.view layoutIfNeeded] zuerst! Voll Lösung ist:

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 

    // ---- autolayout ---- 
    [self.view layoutIfNeeded]; 

    CGSize contentSize = [self.collectionView.collectionViewLayout collectionViewContentSize]; 
    if (contentSize.height > self.collectionView.bounds.size.height) { 
     CGPoint targetContentOffset = CGPointMake(0.0f, contentSize.height - self.collectionView.bounds.size.height); 
     [self.collectionView setContentOffset:targetContentOffset]; 
    } 
} 
0

es funktioniert perfekt für mich (automatische Layout)

  1. berechnen Scroll Content Größe mit collectionViewFlowLayout und cellsize
  2. collectionView.contentSize = calculatedContentSize
  3. collectionView.scrollToItemAtIndexPath (whichYouWantToScrollIndexPath , atScrollPosition: ...)
Verwandte Themen