Mam pole UITextField, które chcę powiększyć po naciśnięciu. Ustawiłem ograniczenia i upewniłem się, że ograniczenie po lewej ma niższy priorytet niż ten, który próbuję animować po prawej stronie.
Oto kod, którego próbuję użyć.
// move the input box
UIView.animateWithDuration(10.5, animations: {
self.nameInputConstraint.constant = 8
}, completion: {
(value: Bool) in
println(">>> move const")
})
To działa, ale wydaje się, że dzieje się to natychmiast i wydaje się, że nie ma żadnego ruchu. Próbowałem ustawić to na 10 sekund, aby upewnić się, że niczego nie umknę, ale uzyskałem te same wyniki.
nameInputConstraint to nazwa ograniczenia, które kontroluję przeciągane, aby połączyć się z moją klasą z IB.
Z góry dziękuję za pomoc!
xcode
swift
constraints
xcode6
icekomo
źródło
źródło
Odpowiedzi:
Najpierw musisz zmienić ograniczenie, a następnie animować aktualizację.
Swift 2
Swift 3, 4, 5
źródło
self
użyte w zamknięciu.SWIFT 4.x:
Przykład z zakończeniem:
źródło
Bardzo ważne jest, aby zaznaczyć, że
view.layoutIfNeeded()
dotyczy to tylko widoków podrzędnych.Dlatego w celu animowania ograniczenia widoku ważne jest, aby wywołać go w widoku kontrolnym animacji w następujący sposób:
Przykład prostego układu w następujący sposób:
źródło
W Swift 5 i iOS 12.3, w zależności od potrzeb, możesz wybrać jeden z 3 następujących sposobów rozwiązania problemu.
# 1. Korzystanie
UIView
zanimate(withDuration:animations:)
metody klasyanimate(withDuration:animations:)
ma następującą deklarację:Poniższy kod Playground pokazuje możliwą implementację
animate(withDuration:animations:)
w celu animacji ciągłej zmiany ograniczenia Auto Layout.# 2. Korzystanie
UIViewPropertyAnimator
zinit(duration:curve:animations:)
inicjalizatora istartAnimation()
metodyinit(duration:curve:animations:)
ma następującą deklarację:Poniższy kod Playground pokazuje możliwą implementację
init(duration:curve:animations:)
istartAnimation()
w celu animowania stałej zmiany ograniczenia Auto Layout.# 3. Korzystanie
UIViewPropertyAnimator
zrunningPropertyAnimator(withDuration:delay:options:animations:completion:)
metody klasyrunningPropertyAnimator(withDuration:delay:options:animations:completion:)
ma następującą deklarację:Poniższy kod Playground pokazuje możliwą implementację
runningPropertyAnimator(withDuration:delay:options:animations:completion:)
w celu animacji ciągłej zmiany ograniczenia Auto Layout.źródło
W moim przypadku zaktualizowałem tylko widok niestandardowy.
źródło
Zobacz to .
Film mówi, że musisz po prostu dodać
self.view.layoutIfNeeded()
:źródło