UICollectionView contentOffset随自定义布局而变化

我有一个UICollectionView与自定义UICollectionViewLayout(实际上,我使用这个不错的布局 )。

我在viewDidLoad中设置了contentOffset = CGPointZero 。 然而,在viewDidLoad之后,偏移量是-20,内容被按下来,如下所示:


图片

(它应该与线路齐平)。 我在界面构build器中加载集合视图布局。 看来我的问题与这个问题非常相似,但是那里的解决scheme并不适合我。

我尝试修改我的布局实现中的collectionViewContentSize ,以确保它始终大于collectionView的大小。 虽然这意味着我可以滚动我的内容(它比collectionView的高度短)并隐藏额外的空间,我也可以向上滚动查看它。

没有什么似乎工作!

我发现这种情况发生的原因。 检查从这个问题接受的答案: 状态栏和导航栏出现在我的视图的边界在iOS 7中

的确,我们可以在viewDidLoad设置edgesForExtendedLayout或者在IB(如果使用Storyboard)中automaticallyAdjustsScrollViewInsets edgesForExtendedLayout UIViewController的UIViewController属性,它将解决我们的问题。

只是不要忘记检查这个属性是可用的,因为在iOS6或之前它将导致崩溃:

 if ([self respondsToSelector:@selector(setAutomaticallyAdjustsScrollViewInsets:)]) { self.automaticallyAdjustsScrollViewInsets = NO; } 

问候!

我能拿出的唯一解决scheme几乎不可接受的行为:

 - (void)scrollViewDidScroll:(UIScrollView *)scrollView { if (self.collectionView.contentOffset.y < 0) { self.collectionView.contentOffset = CGPointMake(self.collectionView.contentOffset.x, 0.0); } } 

以及在collectionViewContentSize中将内容的高度设置为fmax(self.collectionView.frame.size.height + 20, [self stackedSectionHeight])

这将删除部分标题上方的空间,但会从顶部删除“反弹”。 一个相当不理想的解决scheme,但相当可以接受。

我会接受更好的答案,如果任何人有一个,或者如果我find一个我会更新这个答案。