UICollectionView contentOffset随自定义布局而变化

时间:2013-07-16 22:42:57

标签: ios uicollectionview uicollectionviewlayout contentoffset

我有一个带有自定义UICollectionViewLayout的UICollectionView(实际上,我正在使用this nice layout)。

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


picture

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

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

似乎什么都没有用!

5 个答案:

答案 0 :(得分:48)

我找到了发生这种情况的原因。检查此问题的已接受答案: Status bar and navigation bar appear over my view's bounds in iOS 7

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

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

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

问候!

答案 1 :(得分:15)

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

- (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])

中将内容的高度设置为collectionViewContentSize

这会移除部分标题上方的空格,但会从顶部删除“反弹”。一个非常次优的解决方案,但相当可接受。

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

答案 2 :(得分:3)

我开始发现这个问题出现在iOS 11上,我在滚动视图中有一个滚动视图。花了我差不多一天才搞清楚。

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

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

这修复了我的收藏视图调整它的内容,因为收集视图框架将移动到封闭滚动视图的安全区域。

答案 3 :(得分:0)

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)

答案 4 :(得分:0)

这是正确答案的快速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)
    }
}
相关问题