使用 Swift 4 和 UIView 的奇怪动画行为

Posted

技术标签:

【中文标题】使用 Swift 4 和 UIView 的奇怪动画行为【英文标题】:Weird animation behavior using Swift 4 and UIView 【发布时间】:2017-09-28 03:10:03 【问题描述】:

我真的无法弄清楚我的代码有什么问题。让我详细解释一下我的目标是什么:

我在同一个UIViewController 中有两个UIView。它们被称为“redSquare”和“greenSquare”。 当UIViewController 出现时,我想为redSquare 设置动画,以便在Y 轴上移动,直到它到达greenSquare 的上边框。

这就是我设置 xCode 项目的方式:

我得到的行为完全相反,我真的无法理解为什么以及发生了什么:

对此有任何提示或解释吗?

【问题讨论】:

能否详细说明 obj2 和 obj1 是否都是同一个视图的子视图? 哪个是obj1,哪个是obj2 问题已更新,如果一开始就令人困惑,请见谅 您在使用自动布局吗?如何让红色方块最初位于绿色方块之上? @michaelDautermann 是的,我愿意。我用自动布局创建了约束。 redSquare = 中心与 X、Y 对齐,高度设置为 80。greenSquare = 中心与 X 对齐,尾随和前导空间设置为 35,高度等于 180。 【参考方案1】:

好的。部分问题是您正在对齐中心 Y... 这意味着您正在尝试打破动画的约束。

问题的另一部分是您在viewDidLoad 中制作动画,它完全在viewWillAppearviewDidAppear 被调用之前运行。

对于我自己的动画,我通常制作一个约束

也就是说,去掉红框的中心 Y 约束并添加一个新的约束,使红框距离父视图底部有 Y 距离。将此新约束连接到插座,然后您可以像这样制作动画:

@IBOutlet weak var redYConstraint : NSLayoutConstraint!

override func viewDidLoad() 
    super.viewDidLoad()
    // This line sets the red box to be in the center Y of the green box
    self.redYConstraint.constant = self.greenSquare.frame.midY


override func viewDidAppear(_ animated: Bool) 
    super.viewDidAppear(animated)
    UIView.animate(withDuration: 3.0, delay: 2.0, options: UIViewAnimationOptions.curveEaseIn, animations: 
        self.redYConstraint.constant = self.greenSquare.frame.maxY
        self.view.layoutIfNeeded()

    , completion: nil)

【讨论】:

谢谢你,你让我开心!这是我第一次使用故事板和约束(我以前在 SpriteKit 中编程)。

以上是关于使用 Swift 4 和 UIView 的奇怪动画行为的主要内容,如果未能解决你的问题,请参考以下文章

UIView 动画 swift 4 Xcode9 的问题

使用 Swift 在单个 UIView 上同时进行多个动画

使用 [UIView animateKeyframesWithDuration] 为 UIView 设置动画的奇怪行为

动画 UIView 时的奇怪效果

在 Swift 中动画自定义 UIView 属性

在 Swift 中平滑扩展 UIView 动画