【问题标题】:How to left align UICollectionViewCells when scrolling horizontally?水平滚动时如何左对齐 UICollectionViewCells?
【发布时间】:2018-07-26 11:34:43
【问题描述】:

我正在尝试创建一个 UICollectionView,其中的单元格具有不同的宽度但高度不变。 UICollectionView 有 3 行,水平滚动。

每个单元格应该在它右边的下一个单元格和下面的行之间有 8 像素。我已将此设置为 IB 中的最小间距。

当我将滚动设置为垂直时,以下代码可以正常工作,所有单元格都向左对齐,并且所有单元格之间的间距为 8px。但是,如果在水平滚动时使用此代码,则不起作用。

任何方向都将不胜感激。

class HorizontalCollectionViewFlowLayout: UICollectionViewFlowLayout {

    override init(){
        super.init()
        scrollDirection = .horizontal
    }

    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)!
        self.scrollDirection = .horizontal
    }

    override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
        let attributes = super.layoutAttributesForElements(in: rect)

        var leftMargin = sectionInset.left
        var maxY: CGFloat = -1.0
        attributes?.forEach { layoutAttribute in
            if layoutAttribute.frame.origin.y >= maxY {
                leftMargin = sectionInset.left
            }

            layoutAttribute.frame.origin.x = leftMargin

            leftMargin += layoutAttribute.frame.width + minimumInteritemSpacing
            maxY = max(layoutAttribute.frame.maxY , maxY)
        }

        return attributes
    }

}

编辑:这是我想要实现的 UI。

【问题讨论】:

  • 提供您想要实现的具体 UI?
  • @Jaydeep 我附上了我的目标图片
  • 我正需要您正在寻找的东西,您找到解决方案了吗?如果是,请在此处添加,谢谢!

标签: ios swift uicollectionview uicollectionviewlayout uicollectionviewflowlayout


【解决方案1】:

此代码适用于scrollDirection = .horizontal

 import UIKit

class LeftAlignedHorizontalCollectionViewFlowLayout: UICollectionViewFlowLayout {
    
    required override init() {super.init(); common()}
        required init?(coder aDecoder: NSCoder) {super.init(coder: aDecoder); common()}
        
        private func common() {
            scrollDirection = .horizontal
            estimatedItemSize = UICollectionViewFlowLayout.automaticSize
            minimumLineSpacing = 10
            minimumInteritemSpacing = 8
        }
        
        override func layoutAttributesForElements(
                        in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
            
            guard let att = super.layoutAttributesForElements(in:rect) else {return []}
            
            let group = att.group(by: {$0.frame.origin.y})
            
            var x: CGFloat = sectionInset.left
            
            for attr in group {
                x = sectionInset.left
                for a in attr.value {
                    if a.representedElementCategory != .cell { continue }
                    a.frame.origin.x = x
                    x += a.frame.width + minimumInteritemSpacing
                }
            }
            return att
        }
}

extension Array {
    func group<T: Hashable>(by key: (_ element: Element) -> T) -> [[Element]] {
        var categories: [T: [Element]] = [:]
        var groups = [[Element]]()
        for element in self {
            let key = key(element)
            if case nil = categories[key]?.append(element) {
                categories[key] = [element]
            }
        }
        categories.keys.forEach { key in
            if let group = categories[key] {
                groups.append(group)
            }
        }
        return groups
    }
}

【讨论】:

    猜你喜欢
    • 2014-11-15
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 2018-10-01
    • 1970-01-01
    • 2015-05-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多