调用 layoutIfNeeded 后视图未立即显示
View not displayed immediately after layoutIfNeeded is called
我正在尝试使用自动布局制作一个简单的从顶部向下滑动的动画(在 SnapKit
的帮助下)。
下面是我用来生成视图、设置其约束并强制重新加载(从而显示)所述视图的代码。在同一代码中,我将顶部约束更改为不同的值,并在动画块中调用 layoutIfNeeded
。
但实际发生的是视图显示在预期位置,没有任何动画。
这是在短暂延迟后(用于其他目的)在方法中调用的代码:
DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(4), execute: {
self.view.addSubview(view)
view.backgroundColor = .black
view.snp.makeConstraints { (make) -> Void in
make.left.right.equalToSuperview()
make.height.equalTo(200)
make.bottom.equalTo(self.view.snp.top) // Pin view to top to prepare slide-down animation
}
view.setNeedsLayout()
view.layoutIfNeeded()
view.snp.updateConstraints { (make) -> Void in
make.bottom.equalTo(self.view.snp.top).offset(200)
}
view.setNeedsLayout()
UIView.animate(withDuration: 5, animations: {
view.layoutIfNeeded()
})
})
感谢 我找到了罪魁祸首。
虽然我不是 100% 理解这是为什么,但是 layoutIfNeeded
需要从父视图调用,而不是视图本身。
所以调用self.view.layoutIfNeeded()
才是正确的方法。请注意,view
是当前正在添加的 UIView
,而 self.view
是超级视图,view
正在添加到其中。
我正在尝试使用自动布局制作一个简单的从顶部向下滑动的动画(在 SnapKit
的帮助下)。
下面是我用来生成视图、设置其约束并强制重新加载(从而显示)所述视图的代码。在同一代码中,我将顶部约束更改为不同的值,并在动画块中调用 layoutIfNeeded
。
但实际发生的是视图显示在预期位置,没有任何动画。
这是在短暂延迟后(用于其他目的)在方法中调用的代码:
DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(4), execute: {
self.view.addSubview(view)
view.backgroundColor = .black
view.snp.makeConstraints { (make) -> Void in
make.left.right.equalToSuperview()
make.height.equalTo(200)
make.bottom.equalTo(self.view.snp.top) // Pin view to top to prepare slide-down animation
}
view.setNeedsLayout()
view.layoutIfNeeded()
view.snp.updateConstraints { (make) -> Void in
make.bottom.equalTo(self.view.snp.top).offset(200)
}
view.setNeedsLayout()
UIView.animate(withDuration: 5, animations: {
view.layoutIfNeeded()
})
})
感谢
虽然我不是 100% 理解这是为什么,但是 layoutIfNeeded
需要从父视图调用,而不是视图本身。
所以调用self.view.layoutIfNeeded()
才是正确的方法。请注意,view
是当前正在添加的 UIView
,而 self.view
是超级视图,view
正在添加到其中。