Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/116.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios UICollectionView内容使用自定义布局进行偏移更改_Ios_Uicollectionview_Uicollectionviewlayout_Contentoffset - Fatal编程技术网

Ios UICollectionView内容使用自定义布局进行偏移更改

Ios UICollectionView内容使用自定义布局进行偏移更改,ios,uicollectionview,uicollectionviewlayout,contentoffset,Ios,Uicollectionview,Uicollectionviewlayout,Contentoffset,我有一个带有自定义UICollectionViewLayout的UICollectionView(实际上,我正在使用) 我在viewDidLoad中设置了contentOffset=CGPointZero。但是,在viewDidLoad之后,偏移量为-20,并且内容被向下推,如下所示: (应与管线齐平)。我正在interface builder中加载集合视图布局。我的问题似乎与非常相似,但是那里的解决方案对我不起作用 我尝试在布局实现中修改collectionViewContentSize,

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

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


(应与管线齐平)。我正在interface builder中加载集合视图布局。我的问题似乎与非常相似,但是那里的解决方案对我不起作用

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


似乎什么都不管用

我能想出的唯一一个几乎无法接受的解决方案是:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    if (self.collectionView.contentOffset.y < 0) {
        self.collectionView.contentOffset = CGPointMake(self.collectionView.contentOffset.x, 0.0);
    }
}
-(无效)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])
in
collectionViewContentSize

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


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

我找到了发生这种情况的原因。检查此问题的已接受答案:

事实上,我们可以在
viewDidLoad
的IB中设置UIViewController的
edgesForExtendedLayout
automaticallyaadjustsScrollViewInsets
属性(如果您使用故事板),这将解决我们的问题

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

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

问候

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

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

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

这修复了my collectionview在collectionview框架移动过封闭滚动视图的安全区域时对其内容插入进行少量调整的问题。

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

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)
func scrollViewDidScroll(_ scrollView: UIScrollView) {
    if self.collectionView.contentOffset.y < 0 {
        self.collectionView.contentOffset = CGPoint(x: self.collectionView.contentOffset.x, y: 0.0)
    }
}
func scrollViewDidScroll(scrollView:UIScrollView){
如果self.collectionView.contentOffset.y<0{
self.collectionView.contentOffset=CGPoint(x:self.collectionView.contentOffset.x,y:0.0)
}
}

我在使用水平布局时也遇到类似问题。在veritacal布局中,内容正常。当将布局对象更改为水平时,所有内容都消失了名称问题和我找到的解决方案相同。我只有在ios7sdk上,并且只有在iOS7上运行时才能得到这个。最奇怪的是,其他viewController中的另一个scrollView没有这个问题。。我打断了我的头,但没有找到一个原因注意,如果父视图控制器中包含集合视图控制器,您必须在父控制器上设置
自动调整滚动视图insets
。尝试了这么多错误的方法,花了将近两个小时来解决这个问题。谢谢。您所指的公认答案没有提到任何关于自定义布局的内容。@bio,没错,不过我认为在这种情况下,这并不重要。