iOS7:UICollectionView显示在UINavigationBar下

iOS7:UICollectionView显示在UINavigationBar下,ios,uinavigationbar,ios7,Ios,Uinavigationbar,Ios7,我已经在iOS 7上构建了一段时间了,但我还没有解决这个问题,我有许多启用了自动布局的视图,它们是在情节提要中创建的,并使用标准的UINavigationController显示。大多数都可以,但是基于UICollectionView的那些总是将自己放在导航栏下,除非我将半透明设置为NO。我尝试了edgesExtended技巧,但这似乎解决不了问题,我不介意去掉半透明,但我想更干净地解决它 我以前遇到过这个问题,只需将集合视图的边插入设置为上边距: [self.myCollectionVC.c

我已经在iOS 7上构建了一段时间了,但我还没有解决这个问题,我有许多启用了自动布局的视图,它们是在情节提要中创建的,并使用标准的
UINavigationController
显示。大多数都可以,但是基于
UICollectionView
的那些总是将自己放在导航栏下,除非我将半透明设置为
NO
。我尝试了
edgesExtended
技巧,但这似乎解决不了问题,我不介意去掉半透明,但我想更干净地解决它

我以前遇到过这个问题,只需将集合视图的边插入设置为上边距:

 [self.myCollectionVC.collectionView setContentInset:UIEdgeInsetsMake(topMargin, 0, 0, 0)];
其中topMargin是导航栏的大小,或者是希望集合开始滚动的任何点


这样,您的集合视图将开始在导航栏下方滚动,同时,它将填充整个屏幕,如果导航栏是半透明的,您将看到它。

如果您的UICollectionView是视图控制器层次结构中的根视图,并且您的视图控制器的
automaticallyAdjustsScrollViewInsets
设置为“是”(这是默认值),请参考,然后contentInset将自动更新

但是,只有当您的scrollview(或tableview/collectionview/webview btw)是其视图控制器层次结构中的第一个视图时,scrollview的contentInset才会自动更新

我通常首先在层次结构中添加UIImageView,以获得背景图像。如果执行此操作,则必须在ViewDidLayoutSubView中手动设置scrollview的边缘插入:

- (void) viewDidLayoutSubviews {
    [super viewDidLayoutSubviews];
    CGFloat top = self.topLayoutGuide.length;
    CGFloat bottom = self.bottomLayoutGuide.length;
    UIEdgeInsets newInsets = UIEdgeInsetsMake(top, 0, bottom, 0);
    self.collectionView.contentInset = newInsets;

}

我使用的是swift和xcode 7.3.1。我通过转到故事板并选择导航控制器,然后取消选中顶部Bards下的“扩展边缘”来解决此问题。

我在ios 11之后遇到此问题,只需将UICollectionView的contentInsetAdjustmentBehavior设置为never:


太好了,谢谢。我有一种感觉,它可能是沿着这些线,但找不到任何关于它的信息,特别是当我尝试手动调整
UICollectionView
的大小时。topMargin还应该考虑状态栏的高度(20分)您关于将其作为层次结构中的第一个视图的评论是至关重要的-这在我的案例中产生了巨大的差异知道它不是自动处理的,因为视图控制器位于层次结构中是一个很好的补充知识。。。很高兴知道我没有做错什么!谢谢。您应该在此函数中的某个位置调用[super viewDidLayoutSubviews]
-(void) viewDidLoad{
    [super viewDidLoad];
    self.automaticallyAdjustsScrollViewInsets = NO; //added  important
} 

- (void) viewDidLayoutSubviews {
    [super viewDidLayoutSubviews];
    CGFloat top = self.topLayoutGuide.length;
    CGFloat bottom = self.bottomLayoutGuide.length;
    UIEdgeInsets newInsets = UIEdgeInsetsMake(top, 0, bottom, 0);
    self.collectionView.contentInset = newInsets;

}
self.collectionView.contentInsetAdjustmentBehavior = .never