以编程方式删除/添加动画

时间:2016-10-14 12:40:25

标签: ios swift constraints

我在使用动画以编程方式删除和添加约束时遇到了困难。我已将现有项目简化为一个仅用于演示的小项目。

安装程序有两个(容器)视图:顶部和底部。它们包含两个子视图:蓝色和红色。

顶视图的宽高比为2:3约束。

View hierarchy View hierarchy

我参考了我在viewDidLoad中初始化的topView,aspectRatioConstraint和heightConstraint

  @IBOutlet weak var aspectRatioConstraint: NSLayoutConstraint!

  var heightConstraint: NSLayoutConstraint!

  @IBOutlet weak var topView: UIView!

  override func viewDidLoad() {
    super.viewDidLoad()
    heightConstraint = NSLayoutConstraint(item: topView, attribute: .height, relatedBy: .equal, toItem: topView, attribute: .height, multiplier: 1.0, constant: topView.frame.size.height)
    NSLayoutConstraint.activate([heightConstraint])
    topView.removeConstraint(aspectRatioConstraint)
  }

  @IBAction func startAnimation(_ sender: AnyObject) {
    UIView.animate(withDuration: 1.0, delay: 0.0, usingSpringWithDamping: 0.3, initialSpringVelocity: 0.1, options: .curveEaseIn, animations: {
      self.heightConstraint.constant = 20.0
      self.view.layoutIfNeeded()
      }, completion: nil)
  }

" +"导航中的按钮调用startAnimation方法,它应该在一段时间内调整heightConstraint的大小,但它没有。

我做错了什么?

示例项目 - > https://www.dropbox.com/sh/7i75i0zq9dormqb/AACzTYvWOoJL3MjcjgMIyOd9a?dl=0

4 个答案:

答案 0 :(得分:1)

由于子视图中的子视图,我对您的项目感到困惑,但我创建了一个我自己的项目,应该做您需要的。关于您项目的两个侧面说明:

(1)您获得的AutoLayout错误是在更改代码中的约束时。我不知道为什么会发生这种情况......也许是因为你在彼此之间嵌套了全尺寸的子视图,或其他什么。

(2)我会尽可能在ViewDidLoad()中更改/创建约束。 UIView真的没有它所需要的东西。我尝试在ViewWillLayoutSubviews()中进行约束更改。

这是我做的,基本上是你项目的一个子集:

(1)在IB中设置您可以做的事情。故事板中的两个视图(没有嵌套的子视图,但我认为它应该工作)。当然,也可以连接导航控制器的添加按钮!

(2)添加以下约束:

顶视图:

- 领先,尾随和上边距为0 - 宽高比为3:2 - 身高是20

底部视图:

- 所有边距都设为0

(3)纠正IB"错误"通过设置顶视图高度的优先级来自" required"到"高"。

(4)为视图控制器添加方面和高度约束的IBOutlets。

(5)您在视图控制器中只需要以下代码(项目中已关闭)。请注意,我在其他地方添加了代码:

@IBOutlet weak var heightRatio: NSLayoutConstraint!
@IBOutlet weak var aspectRatio: NSLayoutConstraint!

@IBAction func animateLayoutChange(_ sender: UIBarButtonItem) {
    UIView.animate(withDuration: 1.0, delay: 0.0, usingSpringWithDamping: 0.3, initialSpringVelocity: 0.1, options: .curveEaseIn, animations: {
        self.aspectRatio.isActive = false
        self.heightRatio.isActive = true
        self.view.layoutIfNeeded()
        }, completion: nil)
}

答案 1 :(得分:0)

试试这个:

@IBAction func startAnimation(_ sender: AnyObject) {
self.heightConstraint.constant = 20.0
    UIView.animate(withDuration: 1.0, delay: 0.0, usingSpringWithDamping: 0.3, initialSpringVelocity: 0.1, options: .curveEaseIn, animations: {

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

答案 2 :(得分:0)

试试这个:

UIView.animate(withDuration: 1.0, delay: 0.0, usingSpringWithDamping: 0.3, initialSpringVelocity: 0.1, options: .curveEaseIn, animations: {
      NSLayoutConstraint.deactivate([self.heightConstraint])
      self.heightConstraint.constant = 20.0
      NSLayoutConstraint.activate([self.heightConstraint])
      self.view.layoutIfNeeded()
  }, completion: nil)

您在更新某些约束之前已取消激活

答案 3 :(得分:0)

如果您只想为topView的高度设置动画,可以试试这个:

UIView.animate(withDuration: 1.0, delay: 0.0, usingSpringWithDamping: 0.3, initialSpringVelocity: 0.1, options: .curveEaseIn, animations: {
    self.topView.frame.size.height = 20.0
    self.view.layoutIfNeeded()
}, completion: nil)