UICollectionview:滚动到顶部时安全区域上的灰色条

Posted

技术标签:

【中文标题】UICollectionview:滚动到顶部时安全区域上的灰色条【英文标题】:UICollectionview: Grey Bar on safe Area on scroll to the top 【发布时间】:2021-12-27 00:27:26 【问题描述】:

希望你的一周有一个美好的开始!

向上滚动 UICollectionView 时,底部会出现一个灰色条,覆盖底部的 uiView。当我向下滚动时它会消失。我查看了有关堆栈溢出的多个帖子,但找不到适合我的帖子。你能帮忙吗?

import SwiftUI

class MyViewController : UIViewController, UICollectionViewDelegateFlowLayout, UICollectionViewDelegate, UICollectionViewDataSource

 @IBOutlet var myCollectionView: UICollectionView!
 @IBOutlet var homeButton: UIButton!
 @IBOutlet var totshelfButton: UIButton!
 @IBOutlet var profileButton: UIButton!
 @IBOutlet var tabView: UIView!
 @IBOutlet var buttonStack: UIStackView!
 @IBOutlet var borderView: UIView!
 @IBOutlet var labelView: UIView!

 override func viewDidLoad() 
        
        super.viewDidLoad()
        myCollectionView.backgroundColor = .white
        
        myCollectionView.register(UINib(nibName: "MyReusableView", bundle: .none), forCellWithReuseIdentifier: cellid)
        
        myCollectionView.register(UINib(nibName: "HeaderCollectionReusableView", bundle: .none), forSupplementaryViewOfKind: currMonthID, withReuseIdentifier: headerID)
        
        myCollectionView.dataSource = self
        myCollectionView.delegate = self
        
        let layout = setupLayout()
        myCollectionView.collectionViewLayout = layout

    

    override func viewDidLayoutSubviews() 
        
        super.viewDidLayoutSubviews()
        myCollectionView.contentInsetAdjustmentBehavior = .never
        myCollectionView.contentInset = UIEdgeInsets.zero
        myCollectionView.scrollIndicatorInsets = UIEdgeInsets.zero
    
    

    override func viewWillAppear(_ animated: Bool) 
        
        super.viewWillAppear(true)
        self.view.sendSubviewToBack(myCollectionView)
        self.view.bringSubviewToFront(borderView)
        self.view.bringSubviewToFront(tabView)
        self.view.bringSubviewToFront(labelView)
        
        self.tabView.layer.zPosition = 1
        self.labelView.layer.zPosition = 1
        self.borderView.layer.zPosition = 1
    
    

    func setupLayout()-> UICollectionViewCompositionalLayout
    
       return UICollectionViewCompositionalLayout  sectionNumber, env in 
       
                     let item = NSCollectionLayoutItem(layoutSize: .init(widthDimension: .fractionalWidth(0.5), heightDimension: .fractionalHeight(1)))
                               item.contentInsets.trailing = 12
                               item.contentInsets.bottom = 20
                               
                           let group = NSCollectionLayoutGroup.horizontal(layoutSize: .init(widthDimension: .fractionalWidth(1), heightDimension: .fractionalHeight(0.5)), subitems: [item])
                               let section = NSCollectionLayoutSection(group: group)
                            section.contentInsets = NSDirectionalEdgeInsets(top: 10, leading: 10, bottom: 80, trailing: 0)
                           
                           section.boundarySupplementaryItems = [.init(layoutSize: .init(widthDimension: .fractionalWidth(1), heightDimension: .absolute(50.0)), elementKind: self.currMonthID, alignment: .topLeading)]
                           
                           return section

       
    

  func collectionView(_ collectionView: UICollectionView,
                        layout collectionViewLayout: UICollectionViewLayout,
                        sizeForItemAt indexPath: IndexPath) -> CGSize 

        return CGSize(width: self.myCollectionView.frame.width, height: self.myCollectionView.frame.height)
    
    



Screenshot View Hierarchy

【问题讨论】:

【参考方案1】:

我认为您必须使用 zpositions。从您的问题中,我无法找出您使用该 tabView 的原因。您应该尝试将视图嵌入到 tabbarcontroller。

但尝试发送“返回”标签视图或向前推进其他所有内容。而且我觉得这不是最终解决方案,但绝对可以解决。

self.tabView.layer.zPosition = 0 

myCollectionView.layer.zPosition = 3 

【讨论】:

感谢您的快速和善意的回应,Akos!我试过这个,不幸的是它没有奏效。请让我知道我还能尝试什么。 如果我理解正确你想要一个自定义标签栏?而你只是限制了一个 UIView?您可以自定义标签栏以使其看起来像您想要的那样。它会让你的生活更轻松。我猜您将 Viewcontroller 嵌入到 TabbarController 中。如果您在情节提要上选择 Viewcontroller 并转到菜单栏:Editor->Embed In->Tab bar controller。如果它被勾选,只需取消它,标签栏就会消失。但是如果你想要一个标签栏控制的应用程序,你应该使用一个标签栏控制器,并自定义它的外观。 嗨 Akos,是的,我正在尝试自定义标签栏。我会试试你推荐的。您能否告诉我滚动 UICollectionView 时底部出现灰色条的原因? 底部的灰色条是系统标签栏,即标签栏控制器使用的。正如我在前面的评论中提到的,您必须为标签栏创建一个自定义类并与情节提要上的标签栏连接。你可以修改外观。 youtube.com/watch?v=_N4lxebmJ2U 这成功了!非常感谢,阿科斯! :) 抱歉,由于我对 *** 还很陌生,因此没有反映出我对您的回复的投票。

以上是关于UICollectionview:滚动到顶部时安全区域上的灰色条的主要内容,如果未能解决你的问题,请参考以下文章

再次滚动到顶部时的 TwoWayView 空白问题

当导航条滚动到顶部时固定到顶部

滚动到顶部时删除类

滚动到顶部时在表格视图的开头动态添加行

UITableViewcontentInset:当滚动表格到顶部时,行在第一个标题上方仍然可见

更改 NSMutableAttributedString 直到滚动到顶部时,文本视图中的子视图按钮消失