UICollectionView contentOffset随自定义布局而变化

Eva*_*ell 23 ios contentoffset uicollectionview uicollectionviewlayout

我有一个带有自定义UICollectionViewLayout的UICollectionView(实际上,我正在使用这个漂亮的布局).

contentOffset = CGPointZero在viewDidLoad中设置.然而,在viewDidLoad之后,偏移量为-20,并且内容被按下,如下所示:


图片

(它应该与线齐平).我正在界面构建器中加载集合视图布局.似乎我的问题与这个问题非常相似,但那里的解决方案对我不起作用.

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

似乎什么都没有用!

ale*_*pie 48

我找到了发生这种情况的原因.检查此问题的已接受答案: 状态栏和导航栏显示在iOS 7中的视图边界上

实际上,我们可以在IB中设置edgesForExtendedLayoutautomaticallyAdjustsScrollViewInsets使用UIViewController的属性(如果你使用Storyboard),viewDidLoad它将解决我们的问题.

只是不要忘记检查此属性是否可用,因为在iOS6或之前它会导致崩溃:

if ([self respondsToSelector:@selector(setAutomaticallyAdjustsScrollViewInsets:)]) {
    self.automaticallyAdjustsScrollViewInsets = NO;
}
Run Code Online (Sandbox Code Playgroud)

问候!

  • 请注意,如果父视图控制器中包含集合视图控制器,则必须在*parent*控制器上设置`automatedAdjustsScrollViewInsets`. (7认同)

Eva*_*ell 16

我能提出的唯一解决方案是几乎无法接受的行为:

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

除了内容的高度设置为fmax(self.collectionView.frame.size.height + 20, [self stackedSectionHeight])collectionViewContentSize

这将删除节标题上方的空格,但它会从顶部删除"反弹".一个非常次优的解决方案,但相当可接受.

如果有人有,我会接受更好的答案,或者如果我找到一个,我会更新这个答案.


Dav*_*ees 6

我开始发现这个问题出现在 iOS 11 上,我在滚动视图中有一个滚动视图。我花了将近一天的时间才弄明白。

尝试设置内容插入调整行为:

if #available(iOS 11.0, *) {
    scrollView.contentInsetAdjustmentBehavior = .never
}
Run Code Online (Sandbox Code Playgroud)

这修复了我的 collectionview 将其内容插入少量调整为 collectionview 框架将移过封闭滚动视图的安全区域。