如何在集合单元中重新绘制动态尺寸的UIView

时间:2018-07-10 04:07:09

标签: ios swift swift4 uicollectionviewcell

我有一个UICollectionView,在每个UICollectionViewCell内是一个UIView,我正在根据内容动态调整大小...

从数据源中,我在单元格上设置一个模型:

extension CategoryViewController: UICollectionViewDataSource {
    // Show quiz thumbnail and name
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell: QuizViewCell = collectionView.dequeueReusableCell(withReuseIdentifier: cellIdentifier, for: indexPath) as! QuizViewCell

        cell.quiz = self.quizzes[indexPath.row]

        return cell
    }
}

cell.quiz是一个计算的属性。设置好后,我会根据难度计算“进度条”的宽度。为简单起见,我将其设置为100。

class QuizViewCell: UICollectionViewCell {
    @IBOutlet weak var difficultyBar: UIView!

    var quiz: Quiz? {
        didSet {
            configure(quiz)
        }
    }

    private func configure(_ quiz: Quiz?) {
        if let quiz = quiz {
            difficultyBar.frame = CGRect(x: 0, y: 0, width: 100, height: 6)

            // Attempt to redraw bar, but doesn't work
            setNeedsLayout()
            layoutIfNeeded()
        }
    }
}

我知道,如果不是集合,我可以在控制器上调用view.layoutIfNeeded()来强制它重新绘制小节,因为它的宽度已经设置好了。但是我无法弄清楚在什么地方或如何迫使它重画集合视图中某个单元格内的视图。

1 个答案:

答案 0 :(得分:2)

根据您的注释,更改框架将无法使用约束

因此,为conceptBar宽度创建约束

@IBOutlet weak var difficultyBarWidthConstraint: NSLayoutConstraint! //set this to the width of difficultyBar

然后在QuizViewCell中更新宽度约束常量

private func configure(_ quiz: Quiz?) {
    if let quiz = quiz {
        if difficultyBarWidthConstraint != nil {
            difficultyBarWidthConstraint.constant  = 100// width you want to set
        }

    }
}

让我知道这是否可行:-)