整个视图从左上角开始动画
Entire view is animating in from the top-left
嘿,互联网 reader,
我正在构建一个小功能,我的横幅使用 Snapkit 和 Combine 从顶部开始动画。在我的 viewDidLoad
中,我调用 setupObservers
来创建下面的发布者。
在我的应用程序中,isShown
被切换,以便发布者在第一次看到视图时触发,不仅导致横幅而且整个视图从左上角开始动画,0 ,0 位置。
我知道这是因为我正在调用 self.view.layoutIfNeeded()
,我只是想知道如何缓解这种情况,这样我就可以在没有动画的情况下加载视图,然后 显示横幅。
谢谢!
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 = [=11=].top.equalToSuperview()
} else {
self.topConstraint = [=11=].top.equalToSuperview().offset(-Metrics.bannerHeight)
}
}
self.view.layoutIfNeeded()
}
}.store(in: &cancellables)
从动画块中设置常量
self.banner.snp.updateConstraints {
if isShown {
self.topConstraint.update(offset: 0)
} else {
self.topConstraint.update(offset:-Metrics.bannerHeight)
}
}
UIView.animate(withDuration: Metrics.animationDuration, delay: 0, options: .curveEaseInOut) {
self.view.layoutIfNeeded()
}
嘿,互联网 reader,
我正在构建一个小功能,我的横幅使用 Snapkit 和 Combine 从顶部开始动画。在我的 viewDidLoad
中,我调用 setupObservers
来创建下面的发布者。
在我的应用程序中,isShown
被切换,以便发布者在第一次看到视图时触发,不仅导致横幅而且整个视图从左上角开始动画,0 ,0 位置。
我知道这是因为我正在调用 self.view.layoutIfNeeded()
,我只是想知道如何缓解这种情况,这样我就可以在没有动画的情况下加载视图,然后 显示横幅。
谢谢!
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 = [=11=].top.equalToSuperview()
} else {
self.topConstraint = [=11=].top.equalToSuperview().offset(-Metrics.bannerHeight)
}
}
self.view.layoutIfNeeded()
}
}.store(in: &cancellables)
从动画块中设置常量
self.banner.snp.updateConstraints {
if isShown {
self.topConstraint.update(offset: 0)
} else {
self.topConstraint.update(offset:-Metrics.bannerHeight)
}
}
UIView.animate(withDuration: Metrics.animationDuration, delay: 0, options: .curveEaseInOut) {
self.view.layoutIfNeeded()
}