Start UICollectionView at bottom

This works for me and i think it is a modern way.

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

@awolf Your solution is good! But do not work well with autolayout.

You should call [self.view layoutIfNeeded] first! Full solution is:

- (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];
    }
}

The problem is that if you try to set the contentOffset of your collection view in viewWillAppear, the collection view hasn't rendered its items yet. Therefore self.collectionView.contentSize is still {0,0}. The solution is to ask the collection view's layout for the content size.

Additionally, you'll want to make sure that you only set the contentOffset when the contentSize is taller than the bounds of your collection view.

A full solution looks like:

- (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];
    }
}