显然,UICollectionView似乎没有正确地更新UICollectionViewCell布局和约束,直到它被重用.
图片说得比文字更好 – 这就是UIViewController首次出现时的样子:
然而,这不是正确的布局,并且当我将UICollectionView水平向左滑动时,我得到了新出现的单元格的正确布局:
当我向后滑动时,旧的细胞不正确,现在重复使用并且看起来很好.
现在,就像升级到iOS9和Xcode 7之前一样,我想要的效果是即使首次出现,单元格也具有正确的布局.
为方便起见,这里有更多关于如何设置UICollectionView以及它在XIB中的约束的细节:
在代码中,它非常标准:
func collectionView(collectionView: UICollectionView,cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { let cell : MatchmakersCollectionViewCell = collectionView.dequeueReusableCellWithReuseIdentifier("CollectionCell",forIndexPath: indexPath) as! MatchmakersCollectionViewCell cell.imageView.backgroundColor = UIColor.lightGrayColor() cell.bottomName.text = "StackOverflow" return cell } func collectionView(collectionView: UICollectionView,numberOfItemsInSection section: Int) -> Int { return self.matchmakers.count } func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int { return 1 }
每次我更新数据源(self.matchmakers)时,我都调用了self.collectionView.reloadData()
我注意到的最后一件事非常奇怪,当使用Xcode调试调试视图层次结构时,UICollectionViewCell从未正确呈现子视图,只是给了我一个默认的UIView:
解决方法
>使用Nib(.xib)文件创建自定义UICollectionViewCell.
>在自定义UICollectionViewCell中,重写didMoveToSuperView()方法以添加此项
self.setNeedLayout()
self.layoutIfNeeded()
3.在你的UIViewController viewDidLoad()方法中
self.collectionView.registerNib(UINib(nibName:“yourNibName”,bundle:nil),forCellWithReuseIdentifier:“Cell”)
——–更新20150923
只需要第2步,重写didMoveToSuperView方法即可添加
self.setNeedLayout()
self.layoutIfNeeded()
在您的自定义UICollectionViewCell类中.
谢谢@macayer