宽度约束更新后,视图不会重绘

时间:2016-12-20 08:55:35

标签: ios swift autolayout resize

我有以下情况:UIImageView,它的宽度需要在特定事件上递增。当我尝试递增它时,约束正在递增,但视图不会重绘。

UIImageView具有底部,顶部和左侧约束,一个宽度最初设置为0.

以下是Debug View Hierarchy中的图像: enter image description here 更新宽度代码:

self.view.layoutIfNeeded()
self.progressBarThumbWidthConstraint.constant += 30
self.view.updateConstraintsIfNeeded()

UIView.animate(withDuration: 0.3, animations: {
    self.view.layoutIfNeeded()
})

2 个答案:

答案 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

确保立即应用图层更新,而不会产生任何动画或延迟。