Swift의 블록 (animateWithDuration : animations : completion :)


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

명확성이 부족하다고 생각하기 때문에 완료 블록에 후행 폐쇄를 사용하지 않지만 마음에 들면 아래 Trevor의 답변을 볼 수 있습니다 .


1
"자동 완성 기능이 완성을 제공합니다 : ((Bool)-> Void)?하지만 어떻게 작동하는지 확실하지 않습니다."정확히 말한 내용입니다. 이것은 Bool을 취하고 Void를 반환하는 블록이어야합니다.
matt

((Bool)-> Void)가 무엇인지 어떻게 알 수 있습니까? 무엇입니까? BOOL이 완료되었음을 알기 전에 ObjC에서 이것을 사용했기 때문에. 그러나 신속한 코더는 어떻게 알 수 있습니까?
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. 이는 컴파일러에게이 클로저가 'value'레이블이 붙은 Bool을 취하고 void를 반환 함을 알려줍니다.

참고로 bool을 반환하는 클로저를 작성하려면 구문은 다음과 같습니다.

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

$0블록 내부의 변수를 사용하여 첫 번째 인수 를 사용하여 해결할 수도 있습니다 . 컴파일러는 블록이 인수를 허용 함을 파악합니다.
Can

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
이 버전 정확 하다는 점은 주목할 가치가 있습니다. 추론 할 수 있으므로 전체 유형을 작성할 필요가 없으므로 여기에 언급 된 클로저 매개 변수를 언급하기 만하면됩니다.
Chuck

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 
 }

또는 똑같이 자세한 정보를 사용할 수 있습니다.

 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.