ios - didMoveToSuperview 中调用的 UIView.animate 意外影响所有 subview

标签 ios swift animation

我正在处理自定义 UIView。我让一切正常工作,但我的设计要求规定 View 的某些部分应该在加载时进行动画处理。

我的 View 是按以下方式设置的,我选择了动画约束: UIView layout

所以我在 didMoveToSuperview() 中调用了 UIView.animate(),如下所示:

override func didMoveToSuperview() {
    animateArrow()
}

private func animateArrow() {
    UIView.animate(withDuration: 0.3, delay: 0, options: [.curveEaseOut, .autoreverse, .repeat], animations: {
        self.arrowLeadingConstraint.constant += 15
        self.layoutIfNeeded()
    }, completion: nil)
}

我没有做任何其他事情。就其本身而言,动画只会影响我的箭头 ImageView 的前导约束。正如预期的那样,也应该如此。当我在用户交互时启动动画时,我可以验证这一点,如下图所示。

Arrow animation on user interaction

现在,问题是,当从 didMoveToSuperview() 中调用时,动画会以某种方式影响我的自定义 UIView 的所有 subview ...

Animation on didMoveToSuperview

我做错了什么?

最佳答案

看来问题出在您的 animateArrow() 方法本身,如果您稍微修改一下方法,例如这个:

private func animateArrow() {
    self.layoutIfNeeded()
    self.arrowLeadingConstraint.constant = 31 // = 15 + 16 from your original code

    UIView.animate(withDuration: 0.3, delay: 0, options: [.curveEaseOut, .autoreverse, .repeat], animations: {

        self.layoutIfNeeded()
    }, completion: nil)
}

tada,动画将按您的预期正常运行。


为什么...?

我的解释可能不是学术性的,但我希望它对读者有帮助,以便更好地理解。

因此,简而言之,当您处理约束时,您实际上是在隐式地处理一组预定义的 View 与其周围环境之间的关系。这就是为什么您不能成功地为单个约束设置动画(您最初的尝试),因为在此上下文中只有这些关系是可动画的——而不是约束。

因此,您只能为所有关系的更新设置动画您为布局定义了新的约束之后——原则上是在幕后可以一次性为您为每个受影响的 View 的框架制作动画。

您可以阅读更多关于约束是什么以及评估如何与自动布局一起工作的信息 from Apple ,如果您对此感兴趣的话。

关于ios - didMoveToSuperview 中调用的 UIView.animate 意外影响所有 subview ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55723421/

相关文章:

javascript - animate() 不适用于动态 css() 属性

animation - 转换框 : fill-box and firefox 的问题

ios - 具有重复和延迟的 animateKeyframes 无法按预期工作

ios - "No iOS Distribution certificate was found"

ios - 如何像 whats app 那样创建联系人列表

ios - 从 View Controller 中的单元格访问 Firebase 数据

ios - 放置在 UITableViewController 顶部时看不到搜索栏

ios - 如何在保留后退按钮的同时重新加载 navigationController View ?

ios - 为什么 FireBase 查询 block 中的 NSString 为 null?

ios - Swift 是否可以继承一个轻量级的通用 Objective-c 类?