Các khối trên Swift (animateWithDuration: animations: complete :)


102

Tôi đang gặp sự cố khi làm cho các khối hoạt động trên Swift. Đây là một ví dụ hoạt động (không có khối hoàn thành):

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

hoặc cách khác mà không có dấu đóng cuối:

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

nhưng khi tôi cố gắng thêm khối hoàn thành, nó sẽ không hoạt động:

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

Tính năng tự động hoàn thành cung cấp cho tôi completion: ((Bool) -> Void)?nhưng không chắc chắn về cách làm cho nó hoạt động. Cũng đã thử với tính năng đóng dấu nhưng gặp lỗi tương tự:

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

Cập nhật cho 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#>
})

Tôi không sử dụng dấu đóng cuối cho khối hoàn thành vì tôi nghĩ nó thiếu rõ ràng, nhưng nếu bạn thích nó thì bạn có thể xem câu trả lời của Trevor bên dưới .


1
"Tính năng tự động hoàn thành cung cấp cho tôi sự hoàn thành: ((Bool) -> Void)? Nhưng không chắc chắn làm thế nào để làm cho nó hoạt động" Chính xác những gì nó nói. Đây phải là một khối có Bool và trả về Void.
matt

Làm thế nào để bạn biết những gì ((Bool) -> Void)? là cho? Vì tôi đã sử dụng cái này trong ObjC trước khi tôi biết rằng nó đã hoàn thành BOOL. Nhưng làm thế nào một coder nhanh nhẹn biết được?
malhal

Câu trả lời:


202

tham số hoàn thành trong animateWithDuration nhận một khối có một tham số boolean. Trong nhanh chóng, giống như trong các khối obj C, bạn phải chỉ định các tham số mà một bao đóng thực hiện:

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

Phần quan trọng ở đây là (value: Bool) in. Điều đó cho trình biên dịch biết rằng việc đóng này nhận một Bool có nhãn 'giá trị' và trả về giá trị void.

Để tham khảo, nếu bạn muốn viết một bao đóng trả về một bool thì cú pháp sẽ là

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

Cũng có thể được giải quyết bằng cách sử dụng $0cho đối số đầu tiên, chỉ cần sử dụng biến bên trong khối, trình biên dịch sẽ tìm ra rằng khối của bạn chấp nhận một đối số.
Cần

1
cú pháp khối hoàn thành dat :(
Chris Allinson

41

Việc hoàn thành là đúng, việc đóng cửa phải chấp nhận một Booltham số: (Bool) -> (). Thử

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

2
Cần lưu ý rằng phiên bản này là chính xác. Bạn không cần phải viết ra loại đầy đủ vì nó có thể được suy ra, vì vậy tất cả những gì bạn cần chỉ là đề cập đến tham số đóng như đã đề cập ở đây.
Chuck

29

Dấu gạch dưới của chính nó dọc theo intừ khóa sẽ bỏ qua đầu vào

Swift 2

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

Swift 3, 4, 5

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

8

Có giải pháp của tôi ở trên dựa trên câu trả lời được chấp nhận ở trên. Nó làm mờ một tầm nhìn và ẩn nó một khi gần như vô hình.

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

Swift 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

Của bạn đây, điều này sẽ biên dịch

Swift 2

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

Swift 3, 4, 5

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

Lý do tôi đặt vùng Bool là dấu gạch dưới là vì bạn không sử dụng giá trị đó, nếu cần, bạn có thể thay thế (_) bằng (value: Bool)


1

Đôi khi bạn muốn ném điều này vào một biến để tạo hiệu ứng theo những cách khác nhau tùy thuộc vào tình huống. Vì điều đó bạn cần

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

Hoặc bạn có thể sử dụng chi tiết như nhau:

 let completionBlock = { (_:Bool) in 
 }

Nhưng trong mọi trường hợp, bạn phải chỉ ra Boolmột nơi nào đó.


0

SWIFT 3.x + 4.x

Tôi muốn cập nhật và đơn giản hóa mọi thứ.

Ví dụ dưới đây được thực hiện trong bất kỳ viewnó ẩn từ từ và khi nó hoàn toàn trong suốt; tự xóa nó khỏi cha mẹview

okbiến sẽ luôn trả về truekhi kết thúc hoạt ảnh.

    alpha = 1
    UIView.animate(withDuration: 0.5, animations: {
        self.alpha = 0
    }) { (ok) in
        print("Ended \(ok)")
        self.removeFromSuperview()
    }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.