দ্রুত সীমাবদ্ধতা সঞ্চার করার চেষ্টা করছি


242

আমার একটি ইউআইটিেক্সটফিল্ড রয়েছে যা আমি যখন ট্যাপ করে রাখি তখন এর প্রস্থটি প্রসারিত করতে চাই। আমি সীমাবদ্ধতাগুলি সেট আপ করেছি এবং নিশ্চিত করেছি যে বামদিকে সীমাবদ্ধতার নিম্নতর অগ্রাধিকার রয়েছে তারপরে আমি ডানদিকে সঞ্চার করার চেষ্টা করছি।

এখানে কোডটি ব্যবহার করার চেষ্টা করছি।

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

এটি কাজ করে তবে এটি তাত্ক্ষণিকভাবে ঘটবে বলে মনে হচ্ছে এবং কোনও গতিবিধি নেই বলে মনে হচ্ছে। আমি কিছু মিস করছি না তা নিশ্চিত করার জন্য আমি এটি 10 ​​সেকেন্ড সেট করার চেষ্টা করেছি, তবে আমি একই ফলাফল পেয়েছি।

আইবি থেকে আমার ক্লাসে সংযোগ স্থাপনের জন্য আমি যে প্রতিবন্ধকতা টেনে নিয়েছি তার নাম নাম ইনপুটকন্ট্রেন্ট।

আগাম আপনার সহায়তার জন্য ধন্যবাদ!


উত্তর:


665

আপনাকে প্রথমে সীমাবদ্ধতা পরিবর্তন করতে হবে এবং তারপরে আপডেটটি অ্যানিমেট করতে হবে।

self.nameInputConstraint.constant = 8

সুইফট 2

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

সুইফট 3, 4, 5

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

2
কেউ কীভাবে / কেন এটি কাজ করে তা ব্যাখ্যা করতে পারে? যেকোন ইউআইভিউতে অ্যানিমেশনওয়্যারডিউরেশনের সাথে কল করা কোনও শ্রেণীর অ্যানিমেট করবে যা ইউআইভিউ থেকে উত্তরাধিকার সূত্রে প্রাপ্ত এবং কোনও শারীরিক মান পরিবর্তন করে?
নিপোনস

3
আপনার উল্লেখ করা অ্যানিমেশন এপিআই দর্শন এবং স্তরগুলির বৈশিষ্ট্যগুলি অ্যানিমেট করার জন্য ব্যবহৃত হয় । এখানে আমাদের বিন্যাসে পরিবর্তন অ্যানিমেট করতে হবে । বিন্যাসের ধ্রুবকটির ধ্রুবকটি পরিবর্তনের জন্য এটি ডাকে - একা ধ্রুবক পরিবর্তন করা কিছুই করে না।
মুন্ডি

2
@ জ্যাকি সম্ভবত আপনি দৃ strong় এবং দুর্বল ভেরিয়েবলের প্রসঙ্গে উদ্দেশ্যমূলক সি যুক্তি দিয়ে এটি ভুল করছেন। সুইফ্ট ক্লোজারগুলি পৃথক: ক্লোজারটি শেষ হয়ে গেলে, বন্ধে selfব্যবহৃত জিনিসগুলিকে ধরে রাখার কোনও জিনিস নেই ।
মুন্ডি

2
আমার ক্ষেত্রে কাজ করছে না, এটি খুব আগে ঘটছে, কী করা উচিত
শক্তি

13
এটা নোটিশ পেতে এক ঘন্টা আমাকে গ্রহণ, আমি superview উপর layoutIfNeeded ডাকতে আছে ...
Nominalista

28

সুইট 4.x:

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

সমাপ্তির উদাহরণ:

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

2
এটা কাজ করছে না আমি এই UIView.animate করেছ (withDuration: 10, বিলম্ব: 0, বিকল্প: .curveEaseInOut, অ্যানিমেশন: {self.leftViewHeightConstraint.constant = 200 self.leftView.layoutIfNeeded ()}, সম্পূর্ণকরণ: শূন্য)
saurabhgoyal795

1
আপনাকে সীমাবদ্ধতা পরিবর্তন করতে হবে এবং তারপরে অ্যানিমেট করতে হবে।
জ্যারেডে

যদিও এই কোড স্নিপেট একটি সমাধান সহ সমাধান হতে পারে, সত্যিই আপনার পোস্টের গুণমান উন্নত করতে সহায়তা করে। মনে রাখবেন যে আপনি ভবিষ্যতে পাঠকদের জন্য প্রশ্নের উত্তর দিচ্ছেন, এবং সেই লোকেরা আপনার কোড পরামর্শের কারণগুলি জানেন না।
নরেন্দ্র যাদব

উপরের লাইনটি আমার দিন তৈরি করেছে :) আপনাকে ধন্যবাদ @ হাডজী
এনআরভি

18

এটি view.layoutIfNeeded()কেবল দর্শনের সাবউভিউগুলিতে প্রযোজ্য তা উল্লেখ করা খুব গুরুত্বপূর্ণ ।

অতএব দেখার সীমাবদ্ধতা অ্যানিমেট করার জন্য, এটিকে নীচে ভিউ-টু-অ্যানিমেট তত্ত্বাবধানে কল করা গুরুত্বপূর্ণ :

    topConstraint.constant = heightShift

    UIView.animate(withDuration: 0.3) {

        // request layout on the *superview*
        self.view.superview?.layoutIfNeeded()
    }

একটি সাধারণ বিন্যাসের উদাহরণ নিম্নরূপ:

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()
        }
    }
}

সুইফট 4-তে একটি উচ্চতার সীমাবদ্ধতা আপডেট করা হয়েছে এবং ভিউ-এ নিফিডেভিডকে কল করার সময় এটি কাজ করেছে তবে তত্ত্বাবধানটি তা করেনি। সত্যই সহায়ক, ধন্যবাদ!
আলেকক্সোস

এটি সত্যই সঠিক উত্তর। যদি আপনি এটিকে সুপারভিউতে কল না করেন তবে আপনার ভিউটি কেবল নতুন জায়গায় লাফিয়ে। এটি একটি খুব গুরুত্বপূর্ণ পার্থক্য।
ব্রায়ান ডিমার

11

আপনার প্রয়োজন অনুসারে সুইফ্ট 5 এবং আইওএস 12.3 এর সাহায্যে, আপনার সমস্যা সমাধানের জন্য আপনি নিম্নলিখিত 3 টি উপায়ের মধ্যে একটি চয়ন করতে পারেন।


# 1। UIViewএর 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.constraint(equalToSystemSpacingBelow: 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:)আরম্ভকারী এবং startAnimation()পদ্ধতি ব্যবহার করে

init(duration:curve:animations:) নিম্নলিখিত ঘোষণা আছে:

বিল্ট-ইন ইউআইকিট টাইমিং কার্ভ দিয়ে অ্যানিম্যাটর সূচনা করে।

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.constraint(equalToSystemSpacingBelow: 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এর 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:)একটি স্বতঃ লেআউট সীমাবদ্ধতার ধ্রুবক পরিবর্তন অ্যানিমেট করার জন্য একটি কার্যকর বাস্তবায়ন দেখায় ।

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.constraint(equalToSystemSpacingBelow: 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()

1
এমন দুর্দান্ত উত্তর!
বাশতা

@ আইমনউ দুর্দান্ত উত্তর, বিস্তারিত প্রশংসা! সম্ভবত বিকল্পগুলির একটি সংক্ষিপ্ত বিবরণ যুক্ত করুন এবং পার্থক্যটি কী? আমার পক্ষে সত্যিই সহায়ক হবে এবং আমি কেন অন্যের থেকে কেন বেছে নেব সে সম্পর্কে আমার বাক্য বাক্য থাকা নিশ্চিত অন্যদের কাছে।
রায়প্পস

3

আমার ক্ষেত্রে, আমি কেবলমাত্র কাস্টম ভিউ আপডেট করেছি।

// 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()
}

-1

এই দেখুন ।

ভিডিওতে বলা হয়েছে যে আপনাকে self.view.layoutIfNeeded()নিম্নলিখিতগুলির মতো ঠিক যুক্ত করতে হবে :

UIView.animate(withDuration: 1.0, animations: {
       self.centerX.constant -= 75
       self.view.layoutIfNeeded()
}, completion: nil)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.