xcode - तेजी से एक बाधा को एनिमेट करने की कोशिश कर रहा है




swift constraints (3)

मेरे पास एक UITextField है जिसे मैं टैप करने पर इसकी चौड़ाई को बड़ा करना चाहता हूं। मैंने बाधाओं को स्थापित किया और सुनिश्चित किया कि बाईं ओर की बाधा कम प्राथमिकता है, जिसे मैं दाएं तरफ एनिमेट करने की कोशिश कर रहा हूं।

यहां वह कोड है जिसे मैं उपयोग करने का प्रयास कर रहा हूं।

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

यह काम करता है, लेकिन ऐसा लगता है कि तुरंत ऐसा होता है और ऐसा कोई प्रतीत नहीं होता है। मैंने यह सुनिश्चित करने के लिए 10 सेकंड सेट करने की कोशिश की कि मुझे कुछ भी याद नहीं आया, लेकिन मुझे एक ही परिणाम मिला।

nameInputConstraint उस बाधा का नाम है जिसे मैं आईबी से अपनी कक्षा में जोड़ने के लिए खींच लिया गया था।

आपकी सहायता के लिए अग्रिम धन्यवाद!


अपनी जरूरतों के मुताबिक, स्विफ्ट 4.1 और आईओएस 11 के साथ, आप अपनी समस्या को हल करने के लिए 3 में से एक तरीके चुन सकते हैं।

# 1। UIView के animate(withDuration:animations:) का उपयोग करना animate(withDuration:animations:) कक्षा विधि

animate(withDuration:animations:) निम्नलिखित घोषणा है:

निर्दिष्ट अवधि का उपयोग करके एक या अधिक दृश्यों में परिवर्तन को एनिमेट करें।

class func animate(withDuration duration: TimeInterval, animations: @escaping () -> Void)

ऑटो लेआउट बाधा के निरंतर परिवर्तन को एनिमेट करने के लिए नीचे खेल का मैदान कोड animate(withDuration:animations:) संभावित कार्यान्वयन को दिखाता है।

import UIKit
import PlaygroundSupport

class ViewController: UIViewController {

    let textView = UITextView()
    lazy var heightConstraint = textView.heightAnchor.constraint(equalToConstant: 50)

    override func viewDidLoad() {
        view.backgroundColor = .white
        view.addSubview(textView)

        textView.backgroundColor = .orange
        textView.isEditable = false
        textView.text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."

        textView.translatesAutoresizingMaskIntoConstraints = false
        textView.topAnchor.constraintEqualToSystemSpacingBelow(view.layoutMarginsGuide.topAnchor, multiplier: 1).isActive = true
        textView.leadingAnchor.constraint(equalTo: view.layoutMarginsGuide.leadingAnchor).isActive = true
        textView.trailingAnchor.constraint(equalTo: view.layoutMarginsGuide.trailingAnchor).isActive = true
        heightConstraint.isActive = true

        let tapGesture = UITapGestureRecognizer(target: self, action: #selector(doIt(_:)))
        textView.addGestureRecognizer(tapGesture)
    }

    @objc func doIt(_ sender: UITapGestureRecognizer) {
        heightConstraint.constant = heightConstraint.constant == 50 ? 150 : 50
        UIView.animate(withDuration: 2) {
            self.view.layoutIfNeeded()
        }
    }

}

PlaygroundPage.current.liveView = ViewController()

# 2। UIViewPropertyAnimator की init(duration:curve:animations:) का उपयोग init(duration:curve:animations:) प्रारंभिक और startAnimation() विधि

init(duration:curve:animations:) निम्नलिखित घोषणा है:

एक अंतर्निहित UIKit समय वक्र के साथ एनिमेटर शुरू करता है।

convenience init(duration: TimeInterval, curve: UIViewAnimationCurve, animations: (() -> Void)? = nil)

ऑटो लेआउट बाधा के निरंतर परिवर्तन को एनिमेट करने के लिए नीचे खेल का मैदान कोड init(duration:curve:animations:) और startAnimation() संभावित कार्यान्वयन को दिखाता है।

import UIKit
import PlaygroundSupport

class ViewController: UIViewController {

    let textView = UITextView()
    lazy var heightConstraint = textView.heightAnchor.constraint(equalToConstant: 50)

    override func viewDidLoad() {
        view.backgroundColor = .white
        view.addSubview(textView)

        textView.backgroundColor = .orange
        textView.isEditable = false
        textView.text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."

        textView.translatesAutoresizingMaskIntoConstraints = false
        textView.topAnchor.constraintEqualToSystemSpacingBelow(view.layoutMarginsGuide.topAnchor, multiplier: 1).isActive = true
        textView.leadingAnchor.constraint(equalTo: view.layoutMarginsGuide.leadingAnchor).isActive = true
        textView.trailingAnchor.constraint(equalTo: view.layoutMarginsGuide.trailingAnchor).isActive = true
        heightConstraint.isActive = true

        let tapGesture = UITapGestureRecognizer(target: self, action: #selector(doIt(_:)))
        textView.addGestureRecognizer(tapGesture)
    }

    @objc func doIt(_ sender: UITapGestureRecognizer) {
        heightConstraint.constant = heightConstraint.constant == 50 ? 150 : 50
        let animator = UIViewPropertyAnimator(duration: 2, curve: .linear, animations: {
            self.view.layoutIfNeeded()
        })
        animator.startAnimation()
    }

}

PlaygroundPage.current.liveView = ViewController()

# 3। UIViewPropertyAnimator का UIViewPropertyAnimator runningPropertyAnimator(withDuration:delay:options:animations:completion:) कक्षा विधि

runningPropertyAnimator(withDuration:delay:options:animations:completion:) निम्नलिखित घोषणा है:

एनिमेटर ऑब्जेक्ट बनाता है और देता है जो तुरंत अपने एनिमेशन चलाता है।

class func runningPropertyAnimator(withDuration duration: TimeInterval, delay: TimeInterval, options: UIViewAnimationOptions = [], animations: @escaping () -> Void, completion: ((UIViewAnimatingPosition) -> Void)? = nil) -> Self

runningPropertyAnimator(withDuration:delay:options:animations:completion:) लेआउट बाधा के लगातार परिवर्तन को एनिमेट करने के लिए नीचे प्लेग्राउंड कोड runningPropertyAnimator(withDuration:delay:options:animations:completion:) का संभावित कार्यान्वयन दिखाता है।

import UIKit
import PlaygroundSupport

class ViewController: UIViewController {

    let textView = UITextView()
    lazy var heightConstraint = textView.heightAnchor.constraint(equalToConstant: 50)

    override func viewDidLoad() {
        view.backgroundColor = .white
        view.addSubview(textView)

        textView.backgroundColor = .orange
        textView.isEditable = false
        textView.text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."

        textView.translatesAutoresizingMaskIntoConstraints = false
        textView.topAnchor.constraintEqualToSystemSpacingBelow(view.layoutMarginsGuide.topAnchor, multiplier: 1).isActive = true
        textView.leadingAnchor.constraint(equalTo: view.layoutMarginsGuide.leadingAnchor).isActive = true
        textView.trailingAnchor.constraint(equalTo: view.layoutMarginsGuide.trailingAnchor).isActive = true
        heightConstraint.isActive = true

        let tapGesture = UITapGestureRecognizer(target: self, action: #selector(doIt(_:)))
        textView.addGestureRecognizer(tapGesture)
    }

    @objc func doIt(_ sender: UITapGestureRecognizer) {
        heightConstraint.constant = heightConstraint.constant == 50 ? 150 : 50
        UIViewPropertyAnimator.runningPropertyAnimator(withDuration: 2, delay: 0, options: [], animations: {
            self.view.layoutIfNeeded()
        })    
    }

}

PlaygroundPage.current.liveView = ViewController()

आपको पहले बाधा को बदलने की जरूरत है और फिर अद्यतन को एनिमेट करना होगा।

self.nameInputConstraint.constant = 8
UIView.animateWithDuration(0.5) {
    self.view.layoutIfNeeded()
}

और स्विफ्ट 3.0 में:

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

स्विफ्ट 4:

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




xcode6