UIViewController 内的 UICollectionView 不允许滚动

Posted

技术标签:

【中文标题】UIViewController 内的 UICollectionView 不允许滚动【英文标题】:UICollectionView inside UIViewController not allowing scroll 【发布时间】:2018-12-10 08:12:21 【问题描述】:

Edit1:我没有使用情节提要,所有内容都是以编程方式添加的Edit2:更新的代码 sn-p

您好,我遇到以下 UICollectionView 问题

无论您做什么,CollectionView 都不允许您滚动。 有时单元格甚至会完全消失,留下白色背景的 CollectionView。

当您尝试向上滚动查看不可见的单元格时会出现问题。

我创建了一个具有不同类型单元格的 CollectionView。 CollectionView 嵌套在 ImageView 下方的 ViewController 中。 添加了约束,它们工作得很好。

如何让它可滚动?

代表问题的 GIF

ViewController.swift

override func viewDidLoad() 
    super.viewDidLoad()
    
    // Do any additional setup after loading the view.
    self.navigationItem.title = "Featured"
    self.view.backgroundColor = UIColor.white
    
    // Add UImage carousel
    let carousel: UIImageView = 
        let imageView = UIImageView()
        let image = UIImage()
        
        imageView.backgroundColor = UIColor.purple
                    
        return imageView
    ()
    self.view.addSubview(carousel)
    carousel.translatesAutoresizingMaskIntoConstraints = false
    
    // Add CollectionView
    let featuredControllerLayout = UICollectionViewFlowLayout()
    // Add CollectionViewController
    featuredControllerLayout.scrollDirection = .vertical
    let featuredController = FeaturedCollectionViewController(collectionViewLayout: featuredControllerLayout)
    guard let featuredView = featuredController.collectionView else  return 
    
    self.view.addSubview(featuredView)
    featuredView.translatesAutoresizingMaskIntoConstraints = false
    
    // Setup Constraints
    if #available(ios 11.0, *) 
        let guide = self.view.safeAreaLayoutGuide
        let guideSize = guide.layoutFrame.size
        
        carousel.trailingAnchor.constraint(equalTo: guide.trailingAnchor).isActive = true
        carousel.leadingAnchor.constraint(equalTo: guide.leadingAnchor).isActive = true
        carousel.topAnchor.constraint(equalTo: guide.topAnchor).isActive = true
        carousel.frame.size.height = guideSize.width/2
        carousel.heightAnchor.constraint(equalToConstant: carousel.frame.size.height).isActive = true
        
        featuredView.trailingAnchor.constraint(equalTo: guide.trailingAnchor).isActive = true
        featuredView.leadingAnchor.constraint(equalTo: guide.leadingAnchor).isActive = true
        featuredView.topAnchor.constraint(equalTo: carousel.bottomAnchor).isActive = true
        featuredView.bottomAnchor.constraint(equalTo: guide.bottomAnchor).isActive = true
    

【问题讨论】:

您希望看到什么?这只是看起来数据已经用完了。绿色背景是什么来的? 当您向上滚动并将手指从屏幕上移开时,collectionView 会弹回。 “推荐项目”显示一半。绿色背景是我添加的一个空单元格。 看起来你有冲突的约束。您的 v:|view| 约束将与您的安全区域插入指南约束冲突。删除其中一个。 您应该会看到一条消息,告诉您存在这些冲突。 获取消息和删除代码均无效。我怀疑它与collectionViewLayout 有关。我更新了代码 sn-p。 【参考方案1】:

嘿,您说的是您无法向上滚动并查看整个集合视图项?

如果是这种情况,那么您没有考虑标签栏控制器的高度,因此您可以启用半透明,例如我有一个 git repo 我让您可以检查并让我知道您是否卡在任何地方

https://github.com/dwivediashish00/socialApp

【讨论】:

collectionView.bottomAnchor 设置为 tabBar.topAnchor 所以 collectionView 的高度是正确的,我只是不能让它滚动而不弹回顶部。我很难将你的代码与我的代码联系起来,尽管它很相似。我应该添加什么代码建议? 是的,你不需要将底部锚设置到标签栏的顶部,只需调整集合视图的内容插入,例如尝试执行类似 collectionView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: tabBarController?.tabBar.frame.height ?? 0, right: 0) 并尝试添加更多部分和项目以确认其是否实际滚动仅用于测试目的。您可以参考 ViewController -> ViewDidLoad 代码以清楚起见 不幸的是,它无法通过删除锚点并添加 contentInsets... 嘿,谢谢!,我能够让您的收藏视图滚动,因此当我能够使用您的单元格进行滚动工作时,请查看 PR 将再次提交。大多数情况下,您的单元格变白的原因之一是您试图将集合视图控制器嵌入单元格中,这很奇怪,为什么不直接创建 collectionView 并嵌入到单元格中? 太好了,?

以上是关于UIViewController 内的 UICollectionView 不允许滚动的主要内容,如果未能解决你的问题,请参考以下文章

在 UINavigationController 内的 UIViewController 内加载 UITableViewController

UiViewController 内的 UITableView 不对齐中心

UIViewController 内的 UITableView? [关闭]

UITabBar 内的单个 UIViewController 自动旋转

UIViewController 内的 UICollectionViewController 或 CollectionView

UIViewController 内的 UITableView 没有响应(Swift 3.0)