25

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

contentOffset = CGPointZero在 viewDidLoad 中设置。然而,在 viewDidLoad 之后,偏移量为 -20,内容被向下推,如下所示:


图片

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

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

似乎没有任何效果!

4

5 回答 5

48

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

事实上,我们可以在 IB(如果你使用 Storyboard)中设置 UIViewController 的属性,edgesForExtendedLayout它会解决我们的问题。automaticallyAdjustsScrollViewInsetsviewDidLoad

只是不要忘记检查此属性是否可用,因为在 iOS6 或更早版本中它会导致崩溃:

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

问候!

于 2013-10-08T08:51:00.910 回答
16

我能想出的唯一解决方案是几乎不能接受的行为:

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

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

这会删除节标题上方的空间,但会删除顶部的“反弹”。一个相当次优的解决方案,但相当可接受。

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

于 2013-07-18T23:39:30.860 回答
6

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

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

if #available(iOS 11.0, *) {
    scrollView.contentInsetAdjustmentBehavior = .never
}

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

于 2018-01-30T23:31:58.220 回答
1
let oldContentSizeHeight: CGFloat = self.colName.contentSize.height
        self.colName.reloadData()
        self.colName.layoutIfNeeded()
        self.view.layoutIfNeeded()
        self.colName.contentOffset.y = self.colName.contentOffset.y + (self.colName.contentSize.height - oldContentSizeHeight)
于 2019-01-01T10:10:43.677 回答
0

这是正确答案的 swift 4.2 版本,但要使其可行,您必须添加协议UIScrollViewDelegate

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    if self.collectionView.contentOffset.y < 0 {
        self.collectionView.contentOffset = CGPoint(x: self.collectionView.contentOffset.x, y: 0.0)
    }
}
于 2019-01-10T13:32:20.377 回答