net*_*000 4 uicollectionviewlayout swift2
我收到警告"这可能是因为流布局子类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)
}
Run Code Online (Sandbox Code Playgroud)
joe*_*ern 10
Swift中的集合是值类型,这就是他们没有copy()方法的原因.所以当你打电话的时候
array = super.layoutAttributesForElementsInRect(rect) as [UICollectionViewLayoutAttributes]?
Run Code Online (Sandbox Code Playgroud)
它已经创建了超级布局属性数组的副本并将其存储在其中 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
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1281 次 |
| 最近记录: |