proberen een beperking te animeren in swift

Ik heb een UITextFieldwaarvan ik de breedte wil vergroten wanneer erop wordt getikt. Ik heb de beperkingen ingesteld en ervoor gezorgd dat de beperking aan de linkerkant een lagere prioriteit heeft dan degene die ik aan de rechterkant probeer te animeren.

Hier is de code die ik probeer te gebruiken.

// move the input box
UIView.animateWithDuration(10.5, animations: {
    self.nameInputConstraint.constant = 8
    }, completion: {
        (value: Bool) in
        println(">>> move const")
})

Dit werkt, maar het lijkt gewoon onmiddellijk te gebeuren en er lijkt geen beweging te zijn. Ik heb geprobeerd het 10 seconden in te stellen om er zeker van te zijn dat ik niets miste, maar ik kreeg dezelfde resultaten.

nameInputConstraintis de naam van de beperking die ik bedien die ik heb gesleept om vanuit IB verbinding te maken met mijn klas.


Antwoord 1, autoriteit 100%

U moet eerst de beperking wijzigen en vervolgens de update animeren.
Dit zou in het overzicht moeten staan.

self.nameInputConstraint.constant = 8

Swift 2

UIView.animateWithDuration(0.5) {
    self.view.layoutIfNeeded()
}

Swift 3, 4, 5

UIView.animate(withDuration: 0.5) {
    self.view.layoutIfNeeded()
}

Antwoord 2, autoriteit 4%

SWIFT 4 en hoger:

self.mConstraint.constant = 100.0
UIView.animate(withDuration: 0.3) {
        self.view.layoutIfNeeded()
}

Voorbeeld met voltooiing:

self.mConstraint.constant = 100
UIView.animate(withDuration: 0.3, animations: {
        self.view.layoutIfNeeded()
    }, completion: {res in
        //Do something
})

Antwoord 3, autoriteit 4%

Het is erg belangrijk om erop te wijzen dat view.layoutIfNeeded()alleen van toepassing is op de weergave-subweergaven.

Om de weergavebeperking te animeren, is het daarom belangrijk om deze als volgt op de view-to-animate superviewaan te roepen:

   topConstraint.constant = heightShift
    UIView.animate(withDuration: 0.3) {
        // request layout on the *superview*
        self.view.superview?.layoutIfNeeded()
    }

Een voorbeeld voor een eenvoudige lay-out als volgt:

class MyClass {
    /// Container view
    let container = UIView()
        /// View attached to container
        let view = UIView()
    /// Top constraint to animate
    var topConstraint = NSLayoutConstraint()
    /// Create the UI hierarchy and constraints
    func createUI() {
        container.addSubview(view)
        // Create the top constraint
        topConstraint = view.topAnchor.constraint(equalTo: container.topAnchor, constant: 0)
        view.translatesAutoresizingMaskIntoConstraints = false
        // Activate constaint(s)
        NSLayoutConstraint.activate([
           topConstraint,
        ])
    }
    /// Update view constraint with animation
    func updateConstraint(heightShift: CGFloat) {
        topConstraint.constant = heightShift
        UIView.animate(withDuration: 0.3) {
            // request layout on the *superview*
            self.view.superview?.layoutIfNeeded()
        }
    }
}

Antwoord 4

In mijn geval heb ik alleen de aangepaste weergave bijgewerkt.

// DO NOT LIKE THIS
customView.layoutIfNeeded()    // Change to view.layoutIfNeeded()
UIView.animate(withDuration: 0.5) {
   customViewConstraint.constant = 100.0
   customView.layoutIfNeeded() // Change to view.layoutIfNeeded()
}

Antwoord 5

Bekijk dit.

De video zegt dat je gewoon self.view.layoutIfNeeded()moet toevoegen, zoals het volgende:

UIView.animate(withDuration: 1.0, animations: {
       self.centerX.constant -= 75
       self.view.layoutIfNeeded()
}, completion: nil)

Other episodes