在iOS 7中,给定一个UICollectionView,你如何在底部启动它?想想iOS消息应用程序,当视图变得可见时,它始终从底部开始(最新消息)。
问题是,如果您尝试在viewWillAppear中设置集合视图的contentOffset,则集合视图尚未呈现其项目。因此,self.collectionView.contentSize仍为{0,0}。解决方案是询问集合视图的内容大小布局。
此外,您还需要确保仅在contentSize高于集合视图的边界时才设置contentOffset。
完整的解决方案如下:
- (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];
}
}
@awolf你的解决方案很好!但是不能正常使用autolayout。
你应该先调用[self.view layoutIfNeeded]!完整解决方案是:
- (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];
}
}
这对我有用,我认为这是一种现代方式。
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
self.collectionView!.scrollToItemAtIndexPath(indexForTheLast, atScrollPosition: UICollectionViewScrollPosition.Bottom, animated: false)
}
yourCollectionView.contentOffset = CGPointMake(0, yourCollectionView.contentSize.height - yourCollectionView.bounds.size.height);
但请记住,只有当你的contentSize.height
> bounds.size.height
时这样做。
它适合我(自动布局)
在scrollToItemAtIndexPath:atScrollPosition:animated:
的viewWillLayoutSubviews
中添加,以便collectionView将立即加载到底部