【问题标题】:IOS animating subviews as app launches?IOS在应用程序启动时动画子视图?
【发布时间】:2018-07-06 15:44:25
【问题描述】:

我只是想在一些 uiviews 中设置动画,

  • 首先我将viewWillAppear 中的子视图移出屏幕边界
  • 然后我在viewDidAppear 中使用UIView.animate 将它们移回原位

`

override func viewWillAppear(_ animated: Bool) {
  super.viewWillAppear(animated)
  label.center.x -= view.bounds.width
  username.center.x -= view.bounds.width
  password.center.x -= view.bounds.width
  login.center.x -= view.bounds.width
}

override func viewDidAppear(_ animated: Bool) {
  super.viewDidAppear(animated)
  print("view did appear")
  UIView.animate(withDuration: 1) {
    self.label.center.x += self.view.bounds.width
    self.username.center.x += self.view.bounds.width
    self.password.center.x += self.view.bounds.width
    self.login.center.x += self.view.bounds.width
  }
}

我做错了什么?

编辑 1

当我评论viewDidAppear 时,它对视图没有任何影响。 (它们在情节提要中就位)

【问题讨论】:

  • 你做得很好,继续努力。但问题是什么?
  • 当您说“应用程序启动时”是指您尝试在启动屏幕中执行此操作吗?
  • @dahiya_boy 它不起作用,实际上当我评论 viewDidAppear 时,视图根本不动。
  • @Fogmeister 不,我的意思是应用程序启动时它们不存在,然后超过 1 秒,它们从侧面进入动画。
  • 您是否使用自动布局约束来设置它们在情节提要中的位置?如果是这样,您需要为约束值设置动画,否则自动布局会将它们保持在原位。

标签: ios swift uiview core-animation uiviewanimation


【解决方案1】:

Aeid,如果可以的话,我想提供一个替代解决方案,让您无论是否有限制都可以制作动画。

分组

我注意到您正在移动 4 个 UI 元素。我可能会建议您将它们全部组合到一个 UIView 中(具有清晰的背景颜色)。这样,您只需为一个 UI 元素设置动画。

动画

我最喜欢的动画对象之一是“变换”它。您可以应用 3 种转换:

  1. 旋转
  2. 调整大小(称为“缩放”)
  3. 重新定位(称为“翻译”)

每个 UI 对象都有一个 .transform 属性。您使用CGAffineTransform 应用转换。 (CG = 核心图形,仿射 = 保持平行关系。旋转、调整大小和重新定位不会使对象倾斜或扭曲)

代码

class ViewController: UIViewController {

    @IBOutlet weak var loginView: UIView!
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        loginView.transform = CGAffineTransform(translationX: -view.bounds.width, y: 0)
    }
    
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        UIView.animate(withDuration: 1) {
            self.loginView.transform = .identity // Remove the transform
        }
    }
}

优势

  • 对象上的约束条件无关紧要。它会起作用的。
  • 您不必重新定位两次,只需一次。然后移除变换,让它回到原来的位置。

【讨论】:

  • 我知道如何使用CGAffineTransform(来自你的频道——顺便说一句——谢谢),它类似于 css3 转换。但我刚选了一本动画书,我想知道为什么这个例子不适合我。
【解决方案2】:

您需要在该动画闭包中添加self.view.layoutIfNeeded()

UIView.animate(withDuration: 1) {
    self.label.center.x += self.view.bounds.width
    self.username.center.x += self.view.bounds.width
    self.password.center.x += self.view.bounds.width
    self.login.center.x += self.view.bounds.width

    self.view.layoutIfNeeded()
}

【讨论】:

  • 是的,我确实尝试过,但是viewWillAppear 中的代码没有执行,所以它使视图从屏幕向右移动,实际上是由于constraints。 (删除约束解决了这个问题)
  • @aeid “删除约束解决了问题”不!为什么要删除约束?只需保留它们并为约束设置动画,这就是您应该为视图设置动画的方式......不要为框架本身设置动画。
  • @J.Doe 谢谢,注意到了,不过我刚刚开始学习 IOS 动画。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-07
  • 2013-01-16
  • 1970-01-01
  • 2012-06-06
  • 1970-01-01
相关资源
最近更新 更多