সুইফটে ব্লকগুলি (অ্যানিমেটওয়্যারডিউরেশন: অ্যানিমেশন: সমাপ্তি :)


102

সুইফটে ব্লকগুলি তৈরি করতে আমার সমস্যা হচ্ছে। এখানে একটি উদাহরণ যা কাজ করেছে (সম্পূর্ণরূপে অবরুদ্ধ না করে):

UIView.animateWithDuration(0.07) {
    self.someButton.alpha = 1
}

বা বিকল্পভাবে অনুসরণ বন্ধ না করে:

UIView.animateWithDuration(0.2, animations: {
    self.someButton.alpha = 1
})

তবে একবার আমি সম্পূর্ণতা ব্লক যুক্ত করার চেষ্টা করলে এটি কার্যকর হবে না:

UIView.animateWithDuration(0.2, animations: {
    self.blurBg.alpha = 1
}, completion: {
    self.blurBg.hidden = true
})

স্বতঃপূরণ আমাকে দেয় completion: ((Bool) -> Void)?তবে কীভাবে এটি কাজ করবে তা নিশ্চিত নয়। পিছনে বন্ধের চেষ্টা করেও একই ত্রুটি পেয়েছে:

! Could not find an overload for 'animateWithDuration that accepts the supplied arguments

সুইফ্ট 3/4 এর জন্য আপডেট:

// This is how I do regular animation blocks
UIView.animate(withDuration: 0.2) {
    <#code#>
}

// Or with a completion block
UIView.animate(withDuration: 0.2, animations: {
    <#code#>
}, completion: { _ in
    <#code#>
})

আমি সমাপ্তি ব্লকের জন্য অনুসরণকারী বন্ধটি ব্যবহার করি না কারণ আমার ধারণা এটির স্বচ্ছতা নেই, তবে আপনি যদি এটি পছন্দ করেন তবে নীচে ট্রেভর এর উত্তর দেখতে পাবেন ।


1
"স্বতঃসম্পূর্ণ আমাকে পরিপূর্ণতা দেয়: ((মুল) -> অকার্যকর)? তবে কীভাবে এটি কার্যকর করা যায় তা নিশ্চিত নন" ঠিক কী বলে এটি। এটি অবশ্যই একটি ব্লক হবে যা একটি বুল নেয় এবং একটি শূন্যতা ফেরত দেয়।
ম্যাট

কীভাবে জানবেন যে ((বুল) -> শূন্য)? জন্য? যেহেতু আমি এটি বোল শেষ হওয়ার আগেই আমি ওজজিতে এটি ব্যবহার করেছি। কিন্তু একটি সুইফ্ট কোডার কীভাবে জানবে?
ম্যালহাল

উত্তর:


202

অ্যানিমেটওয়াইথডিউরেশনে সম্পূর্ণ হওয়ার প্যারামিটারটি একটি ব্লক নেয় যা একটি বুলিয়ান প্যারামিটার নেয়। ওবিজে সি ব্লকগুলির মতো স্যুইফ্টে, আপনাকে একটি বন্ধ হওয়ার প্যারামিটারগুলি নির্দিষ্ট করতে হবে:

UIView.animateWithDuration(0.2, animations: {
    self.blurBg.alpha = 1
}, completion: {
    (value: Bool) in
    self.blurBg.hidden = true
})

এখানে গুরুত্বপূর্ণ অংশটি হ'ল (value: Bool) in। এটি সংকলককে বলে যে এই বন্ধটি একটি বুলের লেবেলযুক্ত 'মান' নেয় এবং বাতিল করে দেয়।

রেফারেন্সের জন্য, আপনি যদি এমন একটি ক্লোজার লিখতে চান যা একটি সিন ফেরত দেয় সিনট্যাক্সটি

{(value: Bool) -> bool in
    //your stuff
}

$0প্রথম আর্গুমেন্ট ব্যবহার করেও ব্লকের অভ্যন্তরে ভেরিয়েবল ব্যবহার করে সমাধান করা যেতে পারে , সংকলকটি সনাক্ত করে যে আপনার ব্লকটি একটি যুক্তি স্বীকার করে।
ক্যান

1
ডাট সমাপ্তি ব্লক বাক্য গঠন :(
ক্রিস অলিনসন

41

সমাপ্তির সঠিক, অবসান একটি গ্রহণ করতে হবে Boolপরামিতি: (Bool) -> ()। চেষ্টা

UIView.animate(withDuration: 0.2, animations: {
    self.blurBg.alpha = 1
}, completion: { finished in
    self.blurBg.hidden = true
})

2
এই সংস্করণটি সঠিক কিনা তা লক্ষণীয় । আপনাকে সম্পূর্ণ টাইপটি লেখার দরকার নেই যেহেতু এটি অনুমান করা যায়, সুতরাং আপনার কেবলমাত্র ক্লোজার প্যারামিটারটি এখানে বর্ণিত হিসাবে উল্লেখ করা দরকার।
চক

29

inকীওয়ার্ডের পাশাপাশি নিজেই অ্যান্ডস্কোর ইনপুটটিকে উপেক্ষা করবে

সুইফট 2

UIView.animateWithDuration(0.2, animations: {
    self.blurBg.alpha = 1
}, completion: { _ in
    self.blurBg.hidden = true
})

সুইফট 3, 4, 5

UIView.animate(withDuration: 0.2, animations: {
    self.blurBg.alpha = 1
}, completion: { _ in
    self.blurBg.isHidden = true
})

8

উপরে আমার গৃহীত উত্তরের উপর ভিত্তি করে আমার সমাধান রয়েছে। এটি একটি দৃশ্যকে বিবর্ণ করে এবং প্রায় একবার অদৃশ্য হয়ে যায়।

সুইফট 2

func animateOut(view:UIView) {

    UIView.animateWithDuration (0.25, delay: 0.0, options: UIViewAnimationOptions.CurveLinear ,animations: {
        view.layer.opacity = 0.1
        }, completion: { _ in
            view.hidden = true
    })   
}

সুইফট 3, 4, 5

func animateOut(view: UIView) {

    UIView.animate(withDuration: 0.25, delay: 0.0, options: UIView.AnimationOptions.curveLinear ,animations: {
        view.layer.opacity = 0.1
    }, completion: { _ in
        view.isHidden = true
    })
}

4

আপনি এখানে যান, এটি সংকলন করবে

সুইফট 2

UIView.animateWithDuration(0.3, animations: {
    self.blurBg.alpha = 1
}, completion: {(_) -> Void in
    self.blurBg.hidden = true
})

সুইফট 3, 4, 5

UIView.animate(withDuration: 0.3, animations: {
    self.blurBg.alpha = 1
}, completion: {(_) -> Void in
    self.blurBg.isHidden = true
})

আমি বুল অঞ্চলকে আন্ডারস্কোর করার কারণ হ'ল আপনি সেই মানটি ব্যবহার করছেন না, আপনার যদি প্রয়োজন হয় তবে আপনি (_) এর সাথে (মান: বুল) প্রতিস্থাপন করতে পারেন


1

কখনও কখনও আপনি পরিস্থিতির উপর নির্ভর করে বিভিন্নভাবে সঞ্চারিত করতে এটি পরিবর্তনশীলতে ফেলে দিতে চান। তার জন্য আপনার দরকার

 let completionBlock : (Bool) -> () = { _ in 
 }

অথবা আপনি সমান ভার্বোজ ব্যবহার করতে পারেন:

 let completionBlock = { (_:Bool) in 
 }

তবে যে কোনও ক্ষেত্রে আপনাকে Boolকোথাও নির্দেশ করতে হবে ।


0

SWIFT 3.x + 4.x

আমি একটি আপডেট করতে এবং জিনিসগুলি সহজ করতে চাই।

viewএটি ধীরে ধীরে লুকিয়ে থাকে এবং যখন এটি সম্পূর্ণ স্বচ্ছ হয় তখন নীচের উদাহরণ প্রয়োগ করা হয় ; এটি পিতামাতার থেকে নিজেকে সরিয়ে দেয়view

okপরিবর্তনশীল সর্বদা trueঅ্যানিমেশন সমাপ্তির সাথে প্রত্যাবর্তন করবে ।

    alpha = 1
    UIView.animate(withDuration: 0.5, animations: {
        self.alpha = 0
    }) { (ok) in
        print("Ended \(ok)")
        self.removeFromSuperview()
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.