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


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.