嘿,这位网络读者,
我正在构建一个小功能,其中我的横幅从顶部使用Snapkit和Combine动画。在我的ViewDidLoad
中,我调用了SetupObServers
,它在下面创建了这个发布服务器。
在我的应用程序的深处,isshowed
被切换,这样发布者就会在第一次看到视图时触发,这不仅会导致横幅,还会导致整个视图从左上方0,0的位置动画化。
我知道这是因为我调用了self.view.layoutifneed()
,我只是很好奇如何减轻这种情况,这样我就可以在没有动画的情况下加载视图,然后显示横幅。
谢谢!
public override func viewDidLoad() {
super.viewDidLoad()
setupObservers()
viewStore.send(.viewDidLoad)
}
viewStore.publisher
.banner
.isShown
.sink { isShown in
guard self.initLoadFinished else { return }
UIView.animate(withDuration: Metrics.animationDuration, delay: 0, options: .curveEaseInOut) {
self.banner.snp.updateConstraints {
if isShown {
self.topConstraint = $0.top.equalToSuperview()
} else {
self.topConstraint = $0.top.equalToSuperview().offset(-Metrics.bannerHeight)
}
}
self.view.layoutIfNeeded()
}
}.store(in: &cancellables)
在动画块中设置常量
self.banner.snp.updateConstraints {
if isShown {
self.topConstraint.constant = 0
} else {
self.topConstraint.constant = -Metrics.bannerHeight
}
}
UIView.animate(withDuration: Metrics.animationDuration, delay: 0, options: .curveEaseInOut) {
self.view.layoutIfNeeded()
}