UICollectionView Cell子视图在collectionView:cellForItemAtIndexPath完成后调整大小

时间:2016-04-26 05:12:17

标签: ios autolayout uicollectionview uicollectionviewcell

我正在使用集合视图来显示个人资料图片和人名的集合。所以我的单元格有一个UIImageView和一个UILabel作为子视图。我正在使用UICollectionViewDelegateFlowLayout方法:

collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize

根据可用空间计算单元格的大小。

所有这一切都很好。我在单元格中为子视图添加了约束,以便它们也相应地调整大小。

我遇到的问题是我希望我的UIImageViews成为圆圈。在我应用该效果之前,似乎自动布局不会重新计算单元格的子视图大小。相反,当我为imageView计算cornerRadius时,它仍然说imageViews宽度是114.0(这是故事板中的内容),无论单元格有多大。这导致iPhone 5s上的圆圈,但在任何更大的设备上只有圆角。这是我的代码:

override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier("PersonCell", forIndexPath: indexPath)

    configureCell(cell, atIndexPath: indexPath)

    return cell
}

func configureCell(cell: UICollectionViewCell, atIndexPath indexPath: NSIndexPath) {
    if let person = personAtIndexPath(indexPath) {
        let imageView = cell.viewWithTag(100) as! UIImageView
        let nameLabel = cell.viewWithTag(200) as! UILabel

        cell.contentView.frame = cell.bounds
        cell.contentView.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]

        circularizeImageView(imageView)
        imageView.image = person.profileImage
        nameLabel.text = person.name


    }
}

func circularizeImageView(imageView: UIImageView) {
    imageView.layer.cornerRadius = (CGRectGetWidth(imageView.bounds) / 2)
    imageView.clipsToBounds = true
    imageView.layer.borderWidth = 2.0
    imageView.layer.borderColor = UIColor.whiteColor().CGColor
}

我在几个地方看到以前子视图根本不会像这里一样调整大小:UICollectionView cell subviews do not resize

我不认为这是一个问题,但是我确实在我的代码中添加了修复程序,你可以在configureCell()中看到它,但它仍然没有帮助。

因此,在完成cellForItemAtIndexPath调用之后,这些子视图似乎不会调整大小。关于我如何解决这个问题的任何想法?请参见:rounded corners on UIImageViews instead of complete circles

的屏幕截图

1 个答案:

答案 0 :(得分:0)

不要使用viewWithTag(),这是不好的做法。而是制作UILabelUIImageView public或取消范围修饰符。

UIImageView是固定大小的吗?如果是这样,则每次重复使用单元格时都不需要调用circularizeImageView()。而是在layoutSubviews()子类中的UITableViewCell中调用它。这也会为您提供imageView.bounds.height

的正确尺寸