更新动态大小的单元格中的角半径约束

时间:2018-04-23 04:07:44

标签: swift uicollectionview

我有一个自定义的UICollectionViewLayout,可以在滚动时调整页眉高度。

在标题内部,我有一个受限于单元格高度的UIImageView。

我希望图像是圆的,所以我相应地设置了角半径,但是当单元格调整大小时它会出现。约束保持但角半径不会更新。

let cellImage: UIImageView = {
    let s = UIImageView()
    s.clipsToBounds = true
    s.contentMode = .scaleAspectFill
    s.image = UIImage(named: "img")
    s.translatesAutoresizingMaskIntoConstraints = false
    return s
}()

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

override init(frame: CGRect) {
    super.init(frame: frame)

    addSubview(cellImage)
    cellImage.widthAnchor.constraint(equalTo: self.heightAnchor, multiplier: 0.75, constant: 0).isActive = true
    cellImage.heightAnchor.constraint(equalTo: self.heightAnchor, multiplier: 0.75, constant: 0).isActive = true
    cellImage.centerXAnchor.constraint(equalTo: self.centerXAnchor).isActive = true
    cellImage.centerYAnchor.constraint(equalTo: self.centerYAnchor).isActive = true
}

override var frame: CGRect {
    didSet {
        cellImage.layer.cornerRadius = (self.frame.height * 0.75) / 2
    }
}

有什么建议吗?

1 个答案:

答案 0 :(得分:3)

视图frame未直接存储。它是根据图层属性positionbounds.sizetransformanchorPoint计算得出的。你在这里看到的是系统不会使用setFrame:改变框架。

不要在cornerRadius中设置frame.didSet,而是覆盖layoutSubviews进行设置。只要视图的大小发生变化(以及其他一些情况),系统就会调度layoutSubviews

override func layoutSubviews() {
    super.layoutSubviews()
    cellImage.layer.cornerRadius = (frame.height * 0.75) / 2
}