如何快速显示每个单元格附近的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 在表格视图单元格中显示附近的特定营业所