บล็อกบน Swift (animateWithDuration: ภาพเคลื่อนไหว: เสร็จสิ้น :)


102

ฉันมีปัญหาในการทำให้บล็อกทำงานบน Swift นี่คือตัวอย่างที่ใช้งานได้ (ไม่มีการบล็อกที่สมบูรณ์):

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

อัปเดตสำหรับ Swift 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) -> Void)? แต่ไม่แน่ใจว่าจะทำงานอย่างไร" ตรงตามที่กล่าวไว้ ต้องเป็นบล็อกที่ใช้ Bool และส่งคืน Void
แมตต์

คุณรู้ได้อย่างไรว่า ((Bool) -> Void) คืออะไร? สำหรับ? เนื่องจากฉันเคยใช้สิ่งนี้ใน ObjC ก่อนที่ฉันจะรู้ว่า BOOL เสร็จแล้ว แต่นักเขียนโค้ดที่รวดเร็วจะรู้ได้อย่างไร?
malhal

คำตอบ:


202

พารามิเตอร์การทำให้สมบูรณ์ใน animateWithDuration รับบล็อกซึ่งใช้พารามิเตอร์บูลีนหนึ่งตัว อย่างรวดเร็วเช่นเดียวกับในบล็อก Obj C คุณต้องระบุพารามิเตอร์ที่การปิดใช้:

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

ส่วนที่สำคัญนี่คือ(value: Bool) in. นั่นเป็นการบอกคอมไพลเลอร์ว่าการปิดนี้ใช้ Bool ที่มีข้อความว่า 'value' และส่งกลับโมฆะ

สำหรับการอ้างอิงหากคุณต้องการเขียนการปิดที่ส่งคืนบูลไวยากรณ์จะเป็น

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

สามารถแก้ไขได้โดยใช้$0สำหรับอาร์กิวเมนต์แรกเพียงแค่ใช้ตัวแปรภายในบล็อกคอมไพเลอร์จะเห็นว่าบล็อกของคุณยอมรับอาร์กิวเมนต์
สามารถ

1
ไวยากรณ์บล็อกเสร็จสิ้น dat :(
Chris Allinson

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

เหตุผลที่ฉันทำให้พื้นที่ Bool เป็นเครื่องหมายขีดล่างเนื่องจากคุณไม่ได้ใช้ค่านั้นหากคุณต้องการคุณสามารถแทนที่ (_) ด้วย (value: Bool)


1

บางครั้งคุณต้องการใส่ตัวแปรนี้เพื่อให้เคลื่อนไหวในรูปแบบต่างๆขึ้นอยู่กับสถานการณ์ สำหรับสิ่งที่คุณต้องการ

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

หรือคุณสามารถใช้ verbose เท่า ๆ กัน:

 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.