如何快速显示每个单元格附近的Collectionview单元格

Posted

技术标签:

【中文标题】如何快速显示每个单元格附近的Collectionview单元格【英文标题】:How to show Collectionview cells near to each cell in swift 【发布时间】:2021-06-21 07:36:04 【问题描述】:

我需要一个相邻的单元格,如下所示

但我是这样的:简而言之,它们彼此相距甚远

对于collectionview,我在故事板中给出了这样的约束:

height = 80, leading = trailing = 0, top = 20

在viewdidload中:

  override func viewDidLoad() 
    super.viewDidLoad()
    //services collectionview cell
    let serviceLayout = UICollectionViewFlowLayout()
    serviceLayout.minimumInteritemSpacing = 0
    serviceLayout.minimumLineSpacing = 0
    serviceLayout.estimatedItemSize = UICollectionViewFlowLayout.automaticSize
    self.servicesCollectionView.collectionViewLayout = serviceLayout
    servicesCollectionView.contentInsetAdjustmentBehavior = .always
    servicesCollectionView.addObserver(self, forKeyPath: "contentSize", options: .new, context: nil)
   

除此之外,我还没有提供任何其他信息..请帮忙..让collectionview单元格靠近每个单元格

编辑:

对于servicesCollectionView,我在 didload 中评论了所有内容并添加了这样的内容.. 然后它的工作

servicesCollectionView.addObserver(self, forKeyPath: "contentSize", options: .new, context: nil)

对于这个单元格,我需要彼此靠近,如何做到这一点.. 请建议

galleryCollectionView.collectionViewLayout = LeftAlignCellCollectionFlowLayout()

    let galleryLayout = UICollectionViewFlowLayout()
    galleryLayout.scrollDirection = .horizontal
    self.galleryCollectionView.collectionViewLayout = galleryLayout
    self.galleryCollectionView!.contentInset = UIEdgeInsets(top: 0, left: 0, bottom:0, right: 0)
    let heightGallery = 120
    let widthGallery = view.frame.size.width
    if let galleryLayout = self.galleryCollectionView.collectionViewLayout as? UICollectionViewFlowLayout 
        galleryLayout.minimumInteritemSpacing = 0
        galleryLayout.minimumLineSpacing = 0
        galleryLayout.itemSize = CGSize(width: widthGallery * 0.7, height: CGFloat(heightGallery))
    

【问题讨论】:

【参考方案1】:

您需要继承 UICollectionViewFlowLayout 才能获得此行为。

import UIKit

class LeftAlignCellCollectionFlowLayout: UICollectionViewFlowLayout 

    private(set) var cellHeight: CGFloat = 36
    init(cellHeight: CGFloat) 
        super.init()
        self.cellHeight = cellHeight
    

    required init?(coder: NSCoder) 
        super.init(coder: coder)
    
    
    override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? 
        guard let attributes = super.layoutAttributesForElements(in: rect) else  return nil 
        guard let collectionView = self.collectionView else  return nil 
        
        self.estimatedItemSize = UICollectionViewFlowLayout.automaticSize
        self.minimumLineSpacing = 0
        self.minimumInteritemSpacing = 2
        
        var newAttributes = attributes
        var leftMargin = self.sectionInset.left
        var maxY: CGFloat = -1.0
        
        let availableWidth: CGFloat = collectionView.frame.width
        let layout = collectionView.collectionViewLayout
        
        for attribute in attributes 
            if let cellAttribute = layout.layoutAttributesForItem(at: attribute.indexPath) 
                if cellAttribute.frame.width > availableWidth 
                    cellAttribute.frame.origin.x = 0
                    cellAttribute.frame.size = CGSize(width: availableWidth, height: cellHeight)
                
                else 
                    if cellAttribute.frame.origin.y >= maxY 
                        leftMargin = self.sectionInset.left
                    
                    
                    var frame = cellAttribute.frame
                    frame.origin.x = leftMargin
                    frame.size.height = cellHeight
                    cellAttribute.frame = frame
                    
                    leftMargin += cellAttribute.frame.width + self.minimumInteritemSpacing
                    maxY = max(cellAttribute.frame.maxY , maxY)
                
                
                newAttributes.append(cellAttribute)
            
        
        
        return newAttributes
    

这是你如何使用它的。

collectionView.collectionViewLayout = LeftAlignCellCollectionFlowLayout(cellHeight: 40)

【讨论】:

我需要两个collectionviews的这种功能 我们可以在故事板约束中这样做吗?不使用上面的代码 bcz 我正在处理约束 您在故事板、collectionView / collectionViewCell 等中所做的一切都将保持不变。不要更改情节提要中的任何内容,在代码中创建@IBOutlet var collectionView: UICollectionView!,将情节提要中的collectionView 连接到此变量,然后编写上面的行collectionView.collectionViewLayout = ..... 我想要这用于两个不同高度的collectionview..但是你已经给出了这样的private let cellHeight: CGFloat = 50然后如何将它用于两个collectionview 我已经编辑了帖子..我需要解决方案..你能帮我吗

以上是关于如何快速显示每个单元格附近的Collectionview单元格的主要内容,如果未能解决你的问题,请参考以下文章

如何在收藏视图中显示复选标记(图像)

如何在swift3中将每个tableViewcell数据发送到collectionview

使用 iphone GPS 在表格视图单元格中显示附近的特定营业所

如何快速检索不同单元格中的数组元素 ios

如何快速搜索出excel工作表中哪些单元格链接到其他数据源?

如何快速在uicollectionview中动态访问单元格属性