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