2

我正在尝试使用自动布局(在 的帮助下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()
    })
})
4

1 回答 1

2

感谢在 Swift 中,我如何使用自动布局为 UIView 设置动画,就像页面滑入一样?我找到了罪魁祸首。

虽然我不是 100% 明白为什么会这样,但layoutIfNeeded需要从超级视图调用,而不是视图本身。

所以调用self.view.layoutIfNeeded()是正确的方法。请注意,这view是当前正在添加的UIView,而self.view超级视图view是正在添加到的位置。

于 2017-03-19T22:20:04.790 回答