Ответ 1
Метод constraintEqualToAnchor
создает новое ограничение.
Поэтому, когда вы вызываете self.container.bottomAnchor.constraintEqualToAnchor(self.child.bottomAnchor)
в функции выталкивания, вы не используете ограничение, добавленное в методе slideIn
.
Чтобы добиться желаемой анимации скольжения, вам нужно будет сохранить ссылку на предыдущее ограничение. Я не уверен, что эффект установки свойства .active
в ограничении будет в функции выталкивания, поскольку я не знаю, как настроена иерархия вашего представления.
Но один из способов повторного использования ограничения будет содержать его как свойство var в вашем VC:
lazy var bottomConstraint:NSLayoutConstraint = self.container.bottomAnchor
.constraintEqualToAnchor(self.child.bottomAnchor)
func slideOut() {
UIView.animateWithDuration(Double(0.5), animations: {
self.bottomConstraint.active = false
self.view.layoutIfNeeded()
})
}
func slideIn() {
UIView.animateWithDuration(Double(0.5), animations: {
self.bottomConstraint.active = true
self.view.layoutIfNeeded()
})
print("numConstraints: \(container.constraints.count)")
}
Из Apple Docs:
Активация или деактивация вызовов ограничений addConstraint: и removeConstraint: в представлении, которое является ближайшим общим предком элементов, управляемых этим ограничением.
Итак, причина, по которой вы увеличиваете количество ограничений, заключается в том, что вы продолжаете создавать новые и добавляете их, устанавливая active
в true.