首页 > 解决方案 > AutoLayout 约束动画从错误的点缩放

问题描述

我正在尝试使用自动布局约束来实现动画,并与 UIStackViews 一起使用。我遇到了一个动画。

我有一个嵌套在 UIView(橙色)中的 UIImageView(绿色),它又由 UIStackView 处理。当只有这些元素可见时,视图应该缩小。我正在尝试更改以下约束:

视图的约束

通常宽度和高度为 64,前导/尾随/顶部/底部约束为 10,我使用以下方法将它们分别更改为 46 和 7:

private func setImageShrunk() {
    imageWidth.constant = 46
    imageHeight.constant = 46
    imageTopMargin.constant = 7
    imageBottomMargin.constant = 7
    imageRightMargin.constant = 7
    imageLeftMargin.constant = 7
}

这个函数被另一个函数调用:

func shrinkImage(animated: Bool) {
    if(animated) {
        UIView.animate(withDuration: 1) {
            self.setImageShrunk()
            self.layoutIfNeeded()
        }
    } else {
        setImageShrunk()
    }
}

在没有动画的情况下缩小图像会返回预期的结果,当然是突然的。但是,尝试对其进行动画处理,我得到以下结果:

动画事故

我希望视图向左上角缩小,而不是从中心缩小。它不应该“先移动,后扩展”。有谁知道如何在 iOS 11 中使用 AutoLayout 来实现这一点?

标签: iosswiftanimationautolayoutconstraints

解决方案


所以我弄清楚了尝试制作一个小项目来重新创建错误时发生了什么。

在第二个项目中,设置相同,但动画效果与我预期的一样。经过一番思考,我意识到在这个新项目中,我从UIViewController 包含UIStackView.

在最初的问题中,我没有提到我是从一个扩展类调用动画UIStackView,所以 View 本身是动画的。即使它从外部引用了约束,视图也不知道它的环境和嵌入视图。这就是为什么它只是跳跃然后缩放。

我通过将要完成的动画转移到UIViewController包含UIStackView.


推荐阅读