ios - AutoLayout 约束动画从错误的点缩放

标签 ios swift animation autolayout constraints

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

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

The constraints of the Views

通常宽度和高度为 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()
    }
}

在没有动画的情况下缩小图像会返回预期的结果,当然是突然的。但是,尝试为其设置动画时,我得到以下结果:

Animation mishap

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

最佳答案

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

在第二个项目中,设置相同,但动画效果如我所料。经过一番思考后,我意识到在这个新项目中,我从 UIViewController containing UIStackView 调用了动画。

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

我通过将要完成的动画传输到包含 UIStackViewUIViewController 来解决这个问题。

关于ios - AutoLayout 约束动画从错误的点缩放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51969176/

相关文章:

ios - 有谁知道如何呈现像 UIAlertController 这样的 SelectFooViewController

ios - 如何添加过滤器以从 iOS 中录制的音频文件中去除噪音

javascript - 在 iPad 中隐藏地址栏

ios - 如何更改 Collection View 单元格或按钮单击时的渐变?

ios - 当用户在 iOS 11 中点击时,UItextview 选择的文本不会被取消选择

ios - Xcode 8 错误 : 'no such file or directory: '/Users/. ../InstructionBViewController.swift'

ios - 当应用程序被杀死 iOS 10 时处理通知操作

android - 如何实现抽屉打开时动画到后退按钮的抽屉导航按钮(汉堡包)

html - 文本在 css 动画上微调

javascript - 向下和向上滚动时运行一次动画