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

Ste*_*fan 3 uicollectionview swift

我有一个自定义 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
    }
}
Run Code Online (Sandbox Code Playgroud)

有什么建议?

rob*_*off 8

视图frame不直接存储。它是由层的属性计算positionbounds.sizetransform,和anchorPoint。您在这里看到的是系统不会使用setFrame:.

而不是设置cornerRadiusin frame.didSet,overridelayoutSubviews来设置它。layoutSubviews每当视图的大小发生变化(以及在某些其他情况下)时,系统都会安排调用。

override func layoutSubviews() {
    super.layoutSubviews()
    cellImage.layer.cornerRadius = (frame.height * 0.75) / 2
}
Run Code Online (Sandbox Code Playgroud)