如何在不依赖大量约束引用和样板代码的情况下使用自动布局为视图定义动画



在切换到自动布局之前,将动画应用到视图很容易——只需在UIView.layoutWithDuration:中更改帧即可。当约束出现时,事情就会变得更加复杂。为使用自动布局的视图设置动画的最常见方法是保留对要更改的约束的引用,然后设置常数值,但这很难进行设计,并且如果其他视图的约束取决于要设置动画的视图的位置,则会影响其他视图。

必须有更好的方法来做到这一点。我希望能够做一些类似view.translateFrom(direction: .left, distance: 30, duration: 0.3, delay: 0)的事情。

最终,您将希望使用约束来实现简单的动画。最重要的原因是

">选择任何其他方式都只是逆流而行">

如果你不想用@IBOutlets为你想要动画化的约束"乱丢"你的类,那么在大多数情况下,你可以在代码中获得对相关约束的引用:

方便的扩展

import UIKit
extension UIView {
  func constraint(attribute: NSLayoutAttribute) -> NSLayoutConstraint? {
    var constraint : NSLayoutConstraint? = .none
    for potentialCenterXConstraint in self.constraints {
      if potentialCenterXConstraint.firstAttribute == attribute {
        constraint = potentialCenterXConstraint
        break
      }
    }
    return constraint
  }
}

客户端代码使用

if let centerXConstraint = someView.constraint(attribute: .centerX) {
  // Do something funky with centerXConstraint
}

相关内容

最新更新