Ios 如何在集合单元格中重新绘制动态大小的UIView

Ios 如何在集合单元格中重新绘制动态大小的UIView,ios,swift,swift4,uicollectionviewcell,Ios,Swift,Swift4,Uicollectionviewcell,我有一个UICollectionView,在每个UICollectionViewCell中都有一个UIView,我根据内容动态调整大小 从数据源,我正在单元格上设置模型: extension CategoryViewController: UICollectionViewDataSource { // Show quiz thumbnail and name func collectionView(_ collectionView: UICollectionView, cellF

我有一个
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.quick
是一个计算属性。设置好后,我会根据难度计算“进度条”的宽度。为了简单起见,我只是在这里将其设置为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.layoutifneed()
,强制它在设置了宽度后重新绘制条形图。但我不知道在何处或如何强制它重新绘制集合视图中单元格内的视图。

根据您的注释,更改帧将无法工作,因为您正在使用约束

因此,请为“难度栏宽度”创建约束

@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
        }

    }
}

让我知道这是否有效:-)

根据您的评论更改框架将无法工作,因为您正在使用约束

因此,请为“难度栏宽度”创建约束

@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
        }

    }
}

让我知道这是否有效:-)

您是否尝试过重新加载Items(at:[IndexPaths])方法?@Van我只尝试在不同位置的不同视图上调用
setNeedsLayout
layoutIfNeeded
。在设置了
cell.quick之后,我刚刚尝试了
reloadtimes(在:[indexPath])
,但这似乎也不起作用。我应该把它放在别的地方吗?即使在牢房里,你也可以在你的牢房里做cell.layoutIfNeeded(),或者只是重新放置你的牢房,只要一个问题,现在发生了什么,它没有画图?@iraniyanysh谢谢,我不知道我可以直接在牢房里打电话。但是我试过了(见上面的编辑),但仍然不起作用。该条保持宽度为0。我在故事板中有顶部、前导和底部约束以及“占位符”宽度,但没有宽度或尾随约束。您必须提供尾随或宽度约束,如果您设置约束,则更改框架将不起作用。您需要创建IBOulet以适应难度栏宽度,然后必须。更改它您是否尝试了重新加载项(位于:[IndexPaths])方法?@Van我只尝试在不同位置的不同视图上调用
setNeedsLayout
layoutifneed
。在设置了
cell.quick之后,我刚刚尝试了
reloadtimes(在:[indexPath])
,但这似乎也不起作用。我应该把它放在别的地方吗?即使在牢房里,你也可以在你的牢房里做cell.layoutIfNeeded(),或者只是重新放置你的牢房,只要一个问题,现在发生了什么,它没有画图?@iraniyanysh谢谢,我不知道我可以直接在牢房里打电话。但是我试过了(见上面的编辑),但仍然不起作用。该条保持宽度为0。我在故事板中有顶部、前导和底部约束以及“占位符”宽度,但没有宽度或尾随约束。您必须提供尾随或宽度约束,如果您设置约束,则更改框架将不起作用。您需要创建IBOulet以适应难度栏宽度,然后必须。更改谢谢,我刚刚完成了你评论中的内容:)谢谢,我刚刚完成了你评论中的内容:)