我有以下情况:UIImageView,它的宽度需要在特定事件上递增。当我尝试递增它时,约束正在递增,但视图不会重绘。
UIImageView具有底部,顶部和左侧约束,一个宽度最初设置为0.
以下是Debug View Hierarchy中的图像: 更新宽度代码:
self.view.layoutIfNeeded()
self.progressBarThumbWidthConstraint.constant += 30
self.view.updateConstraintsIfNeeded()
UIView.animate(withDuration: 0.3, animations: {
self.view.layoutIfNeeded()
})
答案 0 :(得分:0)
我自己解决了。
问题是视图的约束和框架分别正确更新,但视图的图层不是......解决方案是强制图层用.setNeedsDisplay()
重绘自己
我花了4个多小时寻找解决这个愚蠢问题的方法......
答案 1 :(得分:0)
如果在子类UIView
的视图中遇到相同的问题,并且该视图具有自定义子层,则可以确保在更改视图的框架时更新所有子层(由于某些约束更新或任何其他原因) ),如下所示,通过覆盖视图类中的layoutSublayers(of:CALayer)
函数:
override func layoutSublayers(of layer: CALayer) {
if layer == self.layer {
layer.sublayers?.forEach {
// By disabling actions we make sure that
// frame changes for sublayers are applied immediately without animation
CATransaction.begin()
CATransaction.setDisableActions(true)
$0.frame = layer.bounds
CATransaction.commit()
}
}
}
我们还通过使用CATransaction