2016-12-16 12 views
2

그래서 홈 화면에서 아래로 스크롤하여 배경을 흐릿하게 할 때 스포트라이트 검색과 동일한 것을 달성하기 위해 새로운 UIViewPropertyAnimator와 UIVisualEffectView를 사용하고 있습니다.배경을 흐리게하기 위해 UIViewPropertyAnimator의 fractionComplete에 애니메이션을 적용하십시오.

나는 fractionComplete 속성을 사용하여 UIView를 패닝 할 때 흐리게 처리하는 정도를 설정합니다.

animator = UIViewPropertyAnimator(duration: 1, curve: .linear) { 
     self.blurEffectView.effect = nil 
    } 

그리고 흐림 정도는 0.0 - 1.0 사이의 값으로 변경됩니다.

 animator?.fractionComplete = blurValue 

하지만 내가 흐림이 다시 더 블러에 어디에서 애니메이션을 적용 할 팬 제스처를 취소 할 때 (예를 들어, ~ -> 1.0) 0.4 밀리 초와 같은 무언가의 기간이.

지금은 팬 제스처가 취소 될 때 fractionComplete를 1.0으로 설정합니다. 대신 나는 그것을 움직이기 원합니다.
는 내가 UIView.animate (withDuration을 시도 ...하지만 UIViewPropertyAnimators fractionComplete에 영향을주지 않습니다 및 UIVisualEffectView을 흐리게 할 수있는 유일한 방법 이잖아.

어떤 아이디어?

+0

저는이 시점에서 0과 1 사이에서 전환 할 수있는 값 대신 삭제되는 효과와 관련된 Apple 버그 일 수 있다고 생각합니다. Apple에 레이더 파일을 보내야합니다. – livings124

+0

그냥 확인을 위해, 당신이 패닝을 시작하면 애니메이션이 배경을 흐리게하기 시작합니다. 패닝을 중지하면 원래 상태로 되돌아 가고 싶습니까? –

답변

10

fractionComplete가있다 보인다 버그 (유래에 내 질문 : UIViewPropertyAnimator does not update the view when expected은)., rdar://30856746 속성은 inactive에서 active로 상태를 설정하지만 (나는 가정) 트리거하지 않는 다른 내부 상태가 있기 때문에,보기를 업데이트하지 않습니다

에. 해결 방법 당신이 할 수있는 문제 입니다 : 여기

animator.startAnimation() // This will change the `state` from inactive to active 
animator.pauseAnimation() // This will change `isRunning` back to false, but the `state` will remain as active 

// Now any call of `fractionComplete` should update your view correctly! 
animator.fractionComplete = /* your value here */ 

가 놀러 놀이터 조각입니다 : 당신은 아직도 실제로 슬라이더 나 제스처를 사용하지 않고 fractionComplete 애니메이션을 할 수있는 방법을 찾고 있다면

let liveView = UIView(frame: CGRect(x: 0, y: 0, width: 400, height: 50)) 
liveView.backgroundColor = .white 

PlaygroundPage.current.needsIndefiniteExecution = true 
PlaygroundPage.current.liveView = liveView 

let square = UIView(frame: CGRect(x: 0, y: 0, width: 50, height: 50)) 
square.backgroundColor = .red 

liveView.addSubview(square) 

let animator = UIViewPropertyAnimator.init(duration: 5, curve: .linear) 

animator.addAnimations { 

    square.frame.origin.x = 350 
} 

let blurView = UIVisualEffectView(effect: UIBlurEffect(style: .dark)) 
blurView.frame = liveView.bounds 

liveView.addSubview(blurView) 

animator.addAnimations { 

    blurView.effect = nil 
} 

// If you want to restore the blur after it was animated, you have to 
// safe a reference to the effect which is manipulated 
let effect = blurView.effect 

animator.addCompletion { 
    // In case you want to restore the blur effect 
    if $0 == .start { blurView.effect = effect } 
} 

animator.startAnimation() 
animator.pauseAnimation() 

DispatchQueue.main.asyncAfter(deadline: .now() + 2) { 

    animator.fractionComplete = 0.5 
} 

DispatchQueue.main.asyncAfter(deadline: .now() + 4) { 

    // decide the direction you want your animation to go. 
    // animator.isReversed = true 
    animator.startAnimation() 
} 
+0

매력처럼 작동합니다! 가까운 장래에 문제가 수정되기를 바랍니다. – alengqvist

+0

감사! 속였다. 'startAnimation()'-'pauseAnimation()'댄스를하지 않으면 더 많은 문제가있는 것 같습니다. 'continueAnimation()'호출은 약간의 지연없이 작동하지 않습니다. – Klaas

+0

@Klaas 지금은 진짜 버그인지 또는 의도인지 확실하지 않습니다. WWDC17에서 애플 엔지니어는 항상'startAnimation()'을 호출하지 않고도'pauseAnimation()'을 사용했다. :// 그들은 또한 버그를 해결하려고 노력하고있을 수도 있습니다. : D – DevAndArtist