IOS动画子视图作为应用程序启动?

时间:2018-01-27 12:49:47

标签: ios swift uiview core-animation uiviewanimation

我只想尝试在一些uiviews中制作动画,

  • 首先我要删除viewWillAppear
  • 中屏幕范围外的子视图
  • 然后我使用UIView.animate
  • 中的viewDidAppear将其移回原位

`

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时,它对视图没有任何影响。 (它们在故事板中就位)

2 个答案:

答案 0 :(得分:2)

Aeid,我想提供一种替代解决方案,让您动画是否有约束,如果可能的话。

分组

我注意到你正在移动4个UI元素。我可能会建议你将它们组合成一个UIView(背景颜色清晰)。这样您只需要为一个UI元素设置动画。 One UIView

动画

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

  1. 轮换
  2. 调整大小(称为"比例")
  3. 重新定位(称为"翻译")
  4. 每个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
            }
        }
    }
    

    Animated Login

    优点

    • 对象的约束条件并不重要。它会起作用。
    • 你只需要重新定位两次,只需一次。然后删除变换以使其恢复到原始位置。

答案 1 :(得分:1)

您需要在该动画关闭中添加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()
}