UIView 动画问题 swift 4 Xcode9

issues with UIView animation swift 4 Xcode9

我正在尝试使用 spring 动画块制作一个 UILabel 从屏幕外到中心的动画。下面 viewDidLoad() 中我的代码的第一部分工作得很好,但是当我添加动画块时,它就像动画闭包中的代码首先被读取并且它没有动画,因为标签已经在我希望标签动画的地方。我也试过将这个确切的代码放在 viewDidAppear() 中,但同样的事情发生了。

@IBOutlet weak var follow: UILabel!
@IBOutlet weak var followX: NSLayoutConstraint!

override func viewDidLoad() {
    super.viewDidLoad()

    self.follow.translatesAutoresizingMaskIntoConstraints = false

    self.followX.constant = self.view.frame.width/2 + follow.frame.width/2
    self.view.layoutIfNeeded()

    UIView.animate(withDuration: 2, delay: 2, usingSpringWithDamping: 5, initialSpringVelocity: 5, options: .curveEaseOut, animations: {
        self.followX.constant = 0
        self.view.layoutIfNeeded()
    })

}

这是正确的方法(尽管我会尝试将该动画移动到 viewWillAppearviewDidAppear):

@IBOutlet weak var follow: UILabel!
@IBOutlet weak var followX: NSLayoutConstraint!

override func viewDidLoad() {
    super.viewDidLoad()

    self.follow.translatesAutoresizingMaskIntoConstraints = false

    self.followX.constant = self.view.frame.width/2 + follow.frame.width/2
    self.view.layoutIfNeeded()

    self.followX.constant = 0
    self.view.setNeedsLayout()

    UIView.animate(withDuration: 2, delay: 2, usingSpringWithDamping: 5, initialSpringVelocity: 5, options: .curveEaseOut, animations: {
        self.view.layoutIfNeeded()
    })

}

要使用自动布局:

  1. 您首先要确保开始动画已准备就绪:

    self.followX.constant = self.view.frame.width/2 + follow.frame.width/2
    self.view.layoutIfNeeded()
    
  2. 然后你改变约束到动画的最终状态:

    self.followX.constant = 0
    
  3. 然后告诉自动布局约束已更改:

    self.view.setNeedsLayout()
    
  4. 最后你用 layoutIfNeeded() 调用 UIView.animate 来动画变化:

    UIView.animate(withDuration: 2, delay: 2, usingSpringWithDamping: 5, initialSpringVelocity: 5, options: .curveEaseOut, animations: {
        self.view.layoutIfNeeded()
    })
    
override func viewDidLayoutSubviews() {
   if(once)
   {
      once = false
      self.follow.translatesAutoresizingMaskIntoConstraints = false
      self.followX.constant = self.view.frame.width/2 +   follow.frame.width/2
      self.view.layoutIfNeeded()
   }

}

并且在 viewDidAppear 中

 override func viewDidAppear() {

   self.followX.constant = 0
   UIView.animate(withDuration: 2, delay: 0, usingSpringWithDamping: 5, initialSpringVelocity: 5, options: .curveEaseOut, animations: {
      self.view.layoutIfNeeded()
  })

 }