【问题标题】:iOS7: UICollectionView appearing under UINavigationBariOS7:UICollectionView 出现在 UINavigationBar 下
【发布时间】:2013-09-19 13:37:35
【问题描述】:

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

【问题讨论】:

    标签: ios uinavigationbar ios7


    【解决方案1】:

    仅供参考,如果您的 UICollectionView 是视图控制器层次结构中的根视图,并且您的视图控制器将 automaticallyAdjustsScrollViewInsets 设置为 YES(这是默认设置),那么 contentInset 应该会自动更新。

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

    我经常在我的层次结构中首先添加一个 UIImageView 以获得背景图像。如果这样做,则必须在 viewDidLayoutSubviews 中手动设置滚动视图的边缘插图:

    - (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;
    
    }
    

    【讨论】:

    • 您关于将其作为层次结构中的第一个视图的评论至关重要 - 这对我的情况产生了巨大的影响
    • 知道由于视图控制器位于层次结构中而不会自动处理它是一个很好的附加知识......很高兴知道这不是我做错的事情!谢谢。
    • 你应该在这个函数的某个地方调用[super viewDidLayoutSubviews]
    【解决方案2】:

    我之前也遇到过这个问题,只是将collection view的edge insent设置为上边距:

     [self.myCollectionVC.collectionView setContentInset:UIEdgeInsetsMake(topMargin, 0, 0, 0)];
    

    topMargin 是导航栏的大小,或者您希望集合开始滚动的任何点。

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

    【讨论】:

    • 完美,谢谢。我有一种感觉,它会是类似的东西,但找不到任何信息,尤其是当我尝试手动调整 UICollectionView 的大小时。
    • topMargin 还应考虑状态栏高度(20 pts)
    【解决方案3】:

    在ios 11之后遇到这个问题,只是将UICollectionView的contentInsetAdjustmentBehavior设置为never

    self.collectionView.contentInsetAdjustmentBehavior = .never
    

    【讨论】:

      【解决方案4】:

      我正在使用 swift 和 xcode 7.3.1。我通过转到故事板并选择我的导航控制器然后取消选中“Extend Edges”“Under Top Bards”来解决它。

      【讨论】:

        【解决方案5】:
        -(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;
        
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-09-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多