Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift2 XCode 7:复制布局属性_Swift2_Uicollectionviewlayout - Fatal编程技术网

Swift2 XCode 7:复制布局属性

Swift2 XCode 7:复制布局属性,swift2,uicollectionviewlayout,Swift2,Uicollectionviewlayout,我收到警告“这可能是因为流布局子类MyApp.MenuFlowLayout正在修改UICollectionViewFlowLayout返回的属性,而没有复制它们”。我怎样才能用Swift复制这个 override func layoutAttributesForElementsInRect(rect: CGRect) -> [UICollectionViewLayoutAttributes]? { if let array = super.layoutAttributesForE

我收到警告“这可能是因为流布局子类MyApp.MenuFlowLayout正在修改UICollectionViewFlowLayout返回的属性,而没有复制它们”。我怎样才能用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)
}
重写函数布局属性ForelementsInRect(rect:CGRect)->[UICollectionViewLayoutAttribute]?{
如果let array=super.layouttributesforementsinrect(rect)作为[UICollectionViewLayouttributes]{
var visibleRect=CGRectZero
visibleRect.origin=(self.collectionView?.contentOffset)!
visibleRect.size=(self.collectionView?.bounds.size)!
让ActiveDistance:CGFloat=visibleRect.size.width/2
让zoomFactor:CGFloat=0.15
用于数组中的属性{
如果CGRectIntersectsRect(attributes.frame,visibleRect){
让distance=CGRectGetMidX(visibleRect)-attributes.center.x
设归一化距离=距离/有效距离
如果abs(距离)<有效距离{
设zoom=1+zoomFactor*(1-abs(标准化距离))
attributes.transform3D=CATTransformM3DMakeScale(缩放,缩放,1.0)
attributes.zIndex=1
}
}
}
返回数组
}
返回super.layouttributesforementsinrect(rect)
}

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

array = super.layoutAttributesForElementsInRect(rect) as [UICollectionViewLayoutAttributes]?
它已经创建了超级布局属性数组的副本并将其存储在
数组中

问题不在于阵列没有被复制,而在于您在阵列中更改
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
}