layout - NSCollectionViewFlowLayout - 左对齐

标签 layout nscollectionview leftalign nscollectionviewflowlayout

NSCollectionViewFlowLayout 生成一个布局,其中项目在右边距对齐,或者,如果容器的宽度仅足以容纳一个项目,则将项目居中。我期待一个对齐选项,例如在委托(delegate)上,但在文档中找不到任何内容。它是否需要子类化 NSCollectionViewFlowLayout 来实现这一点?

最佳答案

@Obliquely 的答案在 collectionViewItems 时失败高度不均匀。以下是修改后的代码,用于处理 Swift 4.2 中大小不一的项目:

class CollectionViewLeftFlowLayout: NSCollectionViewFlowLayout
{
    override func layoutAttributesForElements(in rect: CGRect) -> [NSCollectionViewLayoutAttributes]
    {
        let defaultAttributes = super.layoutAttributesForElements(in: rect)

        if defaultAttributes.isEmpty {
            return defaultAttributes
        }

        var leftAlignedAttributes = [NSCollectionViewLayoutAttributes]()

        var xCursor = self.sectionInset.left                            // left margin
        var lastYPosition = defaultAttributes[0].frame.origin.y         // if/when there is a new row, we want to start at left margin
        var lastItemHeight = defaultAttributes[0].frame.size.height

        for attributes in defaultAttributes
        {
            // copy() Needed to avoid warning from CollectionView that cached values are mismatched
            guard let newAttributes = attributes.copy() as? NSCollectionViewLayoutAttributes else {
                continue;
            }

            if newAttributes.frame.origin.y > (lastYPosition + lastItemHeight)
            {
                // We have started a new row
                xCursor = self.sectionInset.left
                lastYPosition = newAttributes.frame.origin.y
            }

            newAttributes.frame.origin.x = xCursor

            xCursor += newAttributes.frame.size.width + minimumInteritemSpacing
            lastItemHeight = newAttributes.frame.size.height

            leftAlignedAttributes.append(newAttributes)
        }
        return leftAlignedAttributes
    }
}

关于layout - NSCollectionViewFlowLayout - 左对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36285720/

相关文章:

c# - 这两种结构有什么区别

cocoa - 更改 NSCollectionView 的选择行为

swift - 通过拖放重新排序 NSCollectionView 中的项目,swift 3+

ios - 向 UITextField 添加左边距

bash - 在 bash 中与 printf 左对齐,宽度未知

C++成员布局

html - 封面+简介版面

ios - 自定义 View 未正确显示

cocoa - 如何在边界更改时对 NSCollectionViewLayout 的重新布局进行动画处理?

css - 表格单元格 div 的左/边距左值