【问题标题】:Entire view is animating in from the top-left整个视图从左上角动画化
【发布时间】:2021-06-28 14:21:48
【问题描述】:

嘿,互联网阅读器,

我正在构建一个小功能,让我的横幅使用 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 = $0.top.equalToSuperview()
                        } else {
                            self.topConstraint = $0.top.equalToSuperview().offset(-Metrics.bannerHeight)
                        }
                    }
                    self.view.layoutIfNeeded()
                }
            }.store(in: &cancellables)

【问题讨论】:

  • 嗨,Zack,很高兴在这里看到你更好的编程!但无论如何,首先在guard self.initLoadFinished 之后尝试self.view.layoutIfNeeded(),所以一切都已布局。然后,按照@Sh_Khan 下面所说的去做。
  • 哈,谢谢 aheze。小世界

标签: ios swift snapkit


【解决方案1】:

从动画块中设置常量

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

【讨论】:

  • 不幸的是,这仍然会导致整个视图从左上角进入动画
  • 创建一次约束并将其设置为常量,仅查看编辑
  • topConstraint 不是典型的NSLayoutConstraint,它是没有constant 属性的SnapKit 的ConstraintMakerEditable 类型之一。所以这行不通,很遗憾。
  • 谢谢。我也发现了这一点。然而,它仍然在为整个视图设置动画,而不仅仅是横幅
  • view.banner.layoutIfNeeded() 也不起作用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-01
  • 1970-01-01
  • 2012-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多