提问者:小点点

整个视图从左上角开始动画化


嘿,这位网络读者,

我正在构建一个小功能,其中我的横幅从顶部使用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)

共1个答案

匿名用户

在动画块中设置常量

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() 
}