स्विफ्ट पर ब्लॉक (चेतनविविधता: एनिमेशन: पूर्णता :)


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
"स्वत: पूर्णता मुझे पूर्णता प्रदान करती है: ((बूल) -> शून्य); लेकिन निश्चित नहीं कि इसे कैसे काम किया जाए" वास्तव में यह क्या कहता है। यह एक ऐसा ब्लॉक होना चाहिए जो बूल लेता है और एक शून्य देता है।
मैट

आप कैसे जानते हैं कि (बूल) -> शून्य) क्या है? के लिए है? चूँकि मुझे पता है कि BOOL समाप्त होने से पहले मैंने इसे ObjC में इस्तेमाल किया है। लेकिन एक स्विफ्ट कोडर को कैसे पता चलेगा?
मल्हल

जवाबों:


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पहले तर्क के लिए उपयोग करके भी हल किया जा सकता है , बस ब्लॉक के अंदर चर का उपयोग करके, संकलक यह बताता है कि आपका ब्लॉक एक तर्क स्वीकार करता है।
कर सकते हैं


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

स्विफ्ट 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()
    }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.