2016-12-16 18 views
2

Итак, я использую новый UIViewPropertyAnimator и UIVisualEffectView для достижения того же, что и поиск Spotlight при прокрутке на главном экране, и он размывает фон.Анимация fractionComplete UIViewPropertyAnimator для размытия фона

Я использую свойство 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

У меня была такая же ошибка, и в этот момент я думаю, что это может быть ошибка Apple, связанная с очищаемым эффектом, а не значение, которое может перейти от 0 до 1. Пожалуйста не забудьте сделать радар с Apple. – livings124

+0

просто для подтверждения, когда вы начинаете панорамирование, анимация начинает размывать фон. когда вы останавливаете панорамирование, вы хотите, чтобы он вернулся в исходное состояние? –

ответ

10

Кажется, что fractionComplete имеет ошибка (мой вопрос о Stackoverflow: 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 */ 

Вот площадка сниппет поиграть:

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 инженеры Apple всегда использовали 'pauseAnimation()', даже не называя 'startAnimation()', что, похоже, тоже делает трюк. :/Может также быть, что они тоже работают над ошибкой. : D – DevAndArtist

0

Если вы все еще ищете способ на самом деле анимировать fractionComplete без использования ползунка или жеста, я был вполне довольны моими результатами, используя CADisplayLink. Вы можете увидеть мои результаты здесь: https://gist.github.com/vegather/07993d15c83ffcd5182c8c27f1aa600b