2016-05-01 3 views
10

Так что я контейнер вид (который пристыкован к краям экрана) и ребенка мнение, что, как предполагается, чтобы скользить в и из нее.Добавление, повторное использование и удаление NSLayoutAnchors

func slideOut() { 
    UIView.animateWithDuration(Double(0.5), animations: { 
     self.container.bottomAnchor 
       .constraintEqualToAnchor(self.child.bottomAnchor).active = false 
     self.view.layoutIfNeeded() 
    }) 
} 

func slideIn() { 
    UIView.animateWithDuration(Double(0.5), animations: { 
     self.container.bottomAnchor 
       .constraintEqualToAnchor(self.child.bottomAnchor).active = true 
     self.view.layoutIfNeeded() 
    }) 
    print("numConstraints: \(container.constraints.count)") 
} 

slideIn() анимация прекрасно, так же, как это должно быть. Проблема в том, что я не знаю, как сделать анимацию slideOut(). Если я просто деактивирую NSLayoutConstraint, как показано выше, то ничего не произойдет. Если вместо этого я стараюсь:

self.container.bottomAnchor 
     .constraintEqualToAnchor(self.child.topAnchor).active = true 

то есть предупреждение о невозможности одновременно удовлетворяют ограничениям и ничего не происходит визуально. Также, когда я делаю активным NSLayoutConstraint, количество ограничений (print(container.constraints.count)) увеличивается, что не может быть хорошо.

Так что мои вопросы:

  1. Как сделать обратную сторону slideIn() анимации в этом случае?
  2. Как повторно использовать существующие ограничения в случае повторных анимаций, чтобы количество ограничений не складывалось?

ответ

11

Метод constraintEqualToAnchor создает новое ограничение. Итак, когда вы вызываете self.container.bottomAnchor.constraintEqualToAnchor(self.child.bottomAnchor) в функцию выдвижения, вы не используете ограничение, добавленное в методе slideIn.

Для достижения желаемой анимации выдвижения вы должны будете ссылаться на предыдущее ограничение. Я не уверен, что эффект установки свойства .active на ограничение будет в функции выталкивания, поскольку я не знаю, как настроена иерархия вашего представления. Но один способ повторного использования ограничение будет проводить его как свойство вар в вашем 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)") 
} 

яблочная Docs:

Включение или выключение ограничения вызовов addConstraint: и removeConstraint: на который является ближайшим общим предком элементов, управляемых этим ограничением.

Так почему вы Seing увеличение числа ограничений, потому что вы продолжаете создавать новые и добавлять их, установив active к истине.

+0

Я пытался изменить UIScrollView contentSize, обновив его последнее нижнее ограничение subview с помощью якорей. Деактивация, изменение и реактивация выполняли эту работу. Спасибо за этот ответ, потому что было бы трудно догадаться, что с ним делать. – Skoua

Смежные вопросы