ios - Swift - 无法使用存储的属性覆盖 'itemSize'

标签 ios swift uicollectionview uicollectionviewcell

如果我尝试设置 itemSize,我会收到此错误。如何正确设置 itemSize

class CenterAlignedCollectionViewFlowLayout: UICollectionViewFlowLayout {

    override var itemSize: CGSize = CGSize(width: 150, height: 150) // -> error

    override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
        guard let superAttributes = super.layoutAttributesForElements(in: rect) else { return nil }
        // Copy each item to prevent "UICollectionViewFlowLayout has cached frame mismatch" warning
        guard let attributes = NSArray(array: superAttributes, copyItems: true) as? [UICollectionViewLayoutAttributes] else { return nil }

        // Constants
        let leftPadding: CGFloat = 8
        let interItemSpacing = minimumInteritemSpacing

        // Tracking values
        var leftMargin: CGFloat = leftPadding // Modified to determine origin.x for each item
        var maxY: CGFloat = -1.0 // Modified to determine origin.y for each item
        var rowSizes: [[CGFloat]] = [] // Tracks the starting and ending x-values for the first and last item in the row
        var currentRow: Int = 0 // Tracks the current row
        attributes.forEach { layoutAttribute in

            // Each layoutAttribute represents its own item
            if layoutAttribute.frame.origin.y >= maxY {

                // This layoutAttribute represents the left-most item in the row
                leftMargin = leftPadding

                // Register its origin.x in rowSizes for use later
                if rowSizes.count == 0 {
                    // Add to first row
                    rowSizes = [[leftMargin, 0]]
                } else {
                    // Append a new row
                    rowSizes.append([leftMargin, 0])
                    currentRow += 1
                }
            }

            layoutAttribute.frame.origin.x = leftMargin

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

            // Add right-most x value for last item in the row
            rowSizes[currentRow][1] = leftMargin - interItemSpacing
        }

        // At this point, all cells are left aligned
        // Reset tracking values and add extra left padding to center align entire row
        leftMargin = leftPadding
        maxY = -1.0
        currentRow = 0
        attributes.forEach { layoutAttribute in

            // Each layoutAttribute is its own item
            if layoutAttribute.frame.origin.y >= maxY {

                // This layoutAttribute represents the left-most item in the row
                leftMargin = leftPadding

                // Need to bump it up by an appended margin
                let rowWidth = rowSizes[currentRow][1] - rowSizes[currentRow][0] // last.x - first.x
                let appendedMargin = (collectionView!.frame.width - leftPadding  - rowWidth - leftPadding) / 2
                leftMargin += appendedMargin

                currentRow += 1
            }

            layoutAttribute.frame.origin.x = leftMargin

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

        return attributes
    }
}

最佳答案

itemSize 声明为可读/可写,要覆盖您必须同时提供 getter 和 setter 的属性

override var itemSize: CGSize {
    get { return CGSize(width: 150, height: 150) }
    set {}
}

override var itemSize: CGSize {
    get { return CGSize(width: 150, height: 150) }
    set { super.itemSize = newValue }
}

关于ios - Swift - 无法使用存储的属性覆盖 'itemSize',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58835433/

相关文章:

ios - 通知中心在某些设备上不显示应用程序

ios - 如何在 Storyboard中为单个 View Controller 打开/关闭自动布局

ios - 带有Tap Gesture Recognizer的UILabel无法正常工作

ios - UICollectionViewCell 布局问题 iOS9

ios - Sprite Kit 中的单个粒子和物理

ios - 具有序列顺序的 Coredata 获取请求

arrays - 将一个文本字段中的多个值存储到一个数组中

ios - 如何在 Swift 中选定的 UITabBarItem 图标下方添加小图标

ios - editButtonItem 不起作用

ios - 如何使用 swift 将单元格添加到动态 Collection View