为什么图像视图有时不会出现在集合视图单元格中?

时间:2016-09-14 18:27:24

标签: swift uiimageview uicollectionview swift3

我刚刚更新到Swift 3。

我的收藏视图在更新前效果很好。我做了推荐的更改以使编译器满意,但现在我遇到了这个问题。

我的自定义UICollectionViewCells中的图像视图根本不再出现。既不以编程方式生成图像视图也不显示原型图像视图。

我已经让图片查看背景颜色以检查我的图片是否为零。背景颜色不会出现,因此可以安全地假设图像视图根本没有出现。

细胞本身正在出现。每个图像视图下方都有一个标签,标签正确显示正确的文本。

最令人困惑的部分是,有时会出现图像视图,但似乎没有押韵或理由为什么或何时。

我的代码非常标准,但无论如何我都会继续分享它:

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return searchClubs.count
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

    let cell: HomeCollectionViewCell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! HomeCollectionViewCell

    cell.barLabel.text = searchClubs[indexPath.row].name
    cell.imageCell.image = searchClubs[indexPath.row].image

    cell.imageCell.layer.masksToBounds = true
    cell.imageCell.layer.cornerRadius = cell.imageCell.frame.height / 2

    return cell

}

func feedSearchClubs(child: AnyObject) {

    let name = child.value(forKey: "Name") as! String    

    //Image
    let base64EncodedString = child.value(forKey: "Image")!
    let imageData = NSData(base64Encoded: base64EncodedString as! String, options: NSData.Base64DecodingOptions.ignoreUnknownCharacters)
    let image = UIImage(data:imageData! as Data)

    //Populate clubs array
    let club = Club.init(name: name, image: image!)
    self.searchClubs.append(club)

    DispatchQueue.main.async {
           self.collectionView.reloadData()
    }
}

2 个答案:

答案 0 :(得分:4)

从Xcode 8开始,您必须调用layoutIfNeeded()来计算大小(在您的情况下,您需要知道cell.imageCell.frame.height)并根据自动布局规则定位或使用cornerRadius的固定值。

cell.imageCell.layoutIfNeeded()
cell.imageCell.layer.masksToBounds = true
cell.imageCell.layer.cornerRadius = cell.imageCell.frame.height / 2

OR

cell.imageCell.layer.masksToBounds = true
cell.imageCell.layer.cornerRadius = 5

答案 1 :(得分:1)

imageCell的框架尚未在 cellForItemAt 方法中设置好。

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell: HomeCollectionViewCell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! HomeCollectionViewCell

    cell.barLabel.text = searchClubs[indexPath.row].name
    cell.imageCell.image = searchClubs[indexPath.row].image

    return cell
}

而是在 willDisplay 上设置图层,因为 cell.imageCell.frame.height 会有其值。

func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
    let cell: HomeCollectionViewCell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! HomeCollectionViewCell

    cell.imageCell.layer.masksToBounds = true
    cell.imageCell.layer.cornerRadius = cell.imageCell.frame.height / 2
}