XCode7:复制布局属性

XCode 7: Copy Layoutattributes

我收到警告 "This is likely occurring because the flow layout subclass MyApp.MenuFlowLayout is modifying attributes returned by UICollectionViewFlowLayout without copying them"。我如何在 Swift 中复制它?

override func layoutAttributesForElementsInRect(rect: CGRect) -> [UICollectionViewLayoutAttributes]? {

    if let array = super.layoutAttributesForElementsInRect(rect) as [UICollectionViewLayoutAttributes]? {

        var visibleRect = CGRectZero
        visibleRect.origin = (self.collectionView?.contentOffset)!
        visibleRect.size = (self.collectionView?.bounds.size)!


        let activeDisatance : CGFloat = visibleRect.size.width / 2
        let zoomFactor : CGFloat = 0.15

        for attributes in array{
            if CGRectIntersectsRect(attributes.frame, visibleRect){
                let distance  = CGRectGetMidX(visibleRect) - attributes.center.x
                let normalizedDistance = distance / activeDisatance
                if abs(distance) < activeDisatance{
                    let zoom = 1 + zoomFactor * (1 - abs(normalizedDistance))
                    attributes.transform3D = CATransform3DMakeScale(zoom, zoom, 1.0)
                    attributes.zIndex = 1
                }
            }
        }
        return array
    }
    return super.layoutAttributesForElementsInRect(rect)
}

Swift 中的集合是值类型,这就是它们没有 copy() 方法的原因。所以当你打电话时

array = super.layoutAttributesForElementsInRect(rect) as [UICollectionViewLayoutAttributes]?

它已经创建了超级布局属性数组的副本并将其存储在 array

问题不是数组没有被复制,问题是你在没有先复制它们的情况下更改数组中的 UICollectionViewLayoutAttributes

要避免此错误消息,您可以这样做:

override func layoutAttributesForElementsInRect(rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
    let attributes = super.layoutAttributesForElementsInRect(rect)
    var attributesCopy = [UICollectionViewLayoutAttributes]()
    for itemAttributes in attributes! {
        let itemAttributesCopy = itemAttributes.copy() as! UICollectionViewLayoutAttributes
        // add the changes to the itemAttributesCopy                       
        attributesCopy.append(itemAttributesCopy)
    }

    return attributesCopy
}