我有一个自定义的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
}
}
有什么建议吗?
答案 0 :(得分:3)
视图frame
未直接存储。它是根据图层属性position
,bounds.size
,transform
和anchorPoint
计算得出的。你在这里看到的是系统不会使用setFrame:
改变框架。
不要在cornerRadius
中设置frame.didSet
,而是覆盖layoutSubviews
进行设置。只要视图的大小发生变化(以及其他一些情况),系统就会调度layoutSubviews
。
override func layoutSubviews() {
super.layoutSubviews()
cellImage.layer.cornerRadius = (frame.height * 0.75) / 2
}