在为宽度约束设置动画时,子视图不会在其父视图中居中

时间:2015-09-11 19:48:11

标签: ios swift autolayout

我有一个容器和居中的孩子。

// Center constraint added to container
NSLayoutConstraint(item: childView, attribute: .CenterX, relatedBy: .Equal, toItem: containerView, attribute: .CenterX, multiplier: 1, constant: 0)

// Width constraint added to child
NSLayoutConstraint(item: childView, attribute: .Width, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1, constant: width)

在列出所有观点之后,他们的立场是正确的。但是,当我开始动画更改孩子的宽度时,它会失去居中位置,并在动画结束时逐渐向后移动。

这是我作为子类的一部分开始动画的方法

  widthConstraint?.constant = widthNew
  UIView.animateWithDuration(2, animations: {
     self.superview?.layoutIfNeeded()
  }) { (completed: Bool) in
     if completed {
        print("done")
     }
  }

在开始设置动画之前,这是初始状态。

enter image description here

这是跳跃发生时失去了它的中心。

enter image description here

但是要完成,它会回到中心。

enter image description here

如何确保它始终居中?

1 个答案:

答案 0 :(得分:1)

我做的是:

SelectionCharOffset = FontSize/(2.2)

限制条件是:

enter image description here 这是工作代码,因此您可以尝试在视图之外更改视图约束。然后我们就会遇到问题。

修改

我将此视图用作动画视图,以便了解在视图中设置自己的约束时的效果。

class ViewController: UIViewController {

        @IBOutlet weak var widthConstraint: NSLayoutConstraint!
        @IBOutlet weak var animatedView: UIView!

        override func viewDidLoad()
        {
            super.viewDidLoad()
        }
        @IBAction func Btn1(sender: AnyObject) {

            widthConstraint?.constant = 20
            UIView.animateWithDuration(2, animations: {
                self.animatedView?.layoutIfNeeded()
                }) { (completed: Bool) in
                    if completed {
                        print("done")
                    }
            }
        }

    }

从其超级视图设置它的widthConstraint并从那里触发动画。这也有效。