Анимируйте UIView с помощью поп-анимации во время ожидания запроса Alamofire
Я пытаюсь анимировать пользовательскую кнопку, используя POP-структуру Facebooks. Анимация не происходит, пока запрос не будет выполнен с использованием Alamofire.
Я хочу сделать запрос и в процессе ожидания анимировать кнопку.
Приведенный ниже код визуально работает, но выполняет запрос после завершения анимации.
func animate(tappedView:UIView){
let rotation = POPBasicAnimation(propertyNamed: kPOPLayerRotationX)
rotation.duration = 2.0
rotation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
tappedView.layer.anchorPoint = CGPointMake(0.5, 0.5)
rotation.toValue = 3*M_PI
let scaleUp = POPBasicAnimation(propertyNamed: kPOPLayerSize)
scaleUp.duration = 0.5
scaleUp.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseIn)
tappedView.layer.anchorPoint = CGPointMake(0.5, 0.5)
let size = CGSizeMake(tappedView.frame.size.width ,tappedView.frame.size.height)
let scaledSize = CGSizeMake(size.width * 1.5, size.height * 1.5)
scaleUp.toValue = NSValue(CGSize: scaledSize)
let scaleDown = POPSpringAnimation(propertyNamed: kPOPLayerSize)
scaleDown.beginTime = CACurrentMediaTime() + 0.5
scaleDown.toValue = NSValue(CGSize: size)
scaleDown.springSpeed = 4
scaleDown.springBounciness = 8
scaleDown.completionBlock = { (anim:POPAnimation!, finished:Bool) -> Void in
let requestURL = self.prepare4SQrequest(withLocation: self.currentLocation)
let request = Alamofire.request(.GET, requestURL)
request.responseJSON{ response in
HANDLE REQUEST RESPONSE LOGIC
}
tappedView.layer.pop_addAnimation(rotation, forKey: "popRotationX")
tappedView.layer.pop_addAnimation(scaleUp, forKey: "popScaleUp")
tappedView.layer.pop_addAnimation(scaleDown, forKey: "popScaleD")
}
Я пытался использовать request.progress Alamofire, но он не работал. В этой версии анимация начинается после завершения логики запроса.
func animate(tappedView:UIView){
let rotation = POPBasicAnimation(propertyNamed: kPOPLayerRotationX)
rotation.duration = 2.0
rotation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
tappedView.layer.anchorPoint = CGPointMake(0.5, 0.5)
rotation.toValue = 3*M_PI
let scaleUp = POPBasicAnimation(propertyNamed: kPOPLayerSize)
scaleUp.duration = 0.5
scaleUp.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseIn)
tappedView.layer.anchorPoint = CGPointMake(0.5, 0.5)
let size = CGSizeMake(tappedView.frame.size.width ,tappedView.frame.size.height)
let scaledSize = CGSizeMake(size.width * 1.5, size.height * 1.5)
scaleUp.toValue = NSValue(CGSize: scaledSize)
let scaleDown = POPSpringAnimation(propertyNamed: kPOPLayerSize)
scaleDown.beginTime = CACurrentMediaTime() + 0.5
scaleDown.toValue = NSValue(CGSize: size)
scaleDown.springSpeed = 4
scaleDown.springBounciness = 8
tappedView.layer.pop_addAnimation(rotation, forKey: "popRotationX")
tappedView.layer.pop_addAnimation(scaleUp, forKey: "popScaleUp")
tappedView.layer.pop_addAnimation(scaleDown, forKey: "popScaleD")
}
func buttonTapped(gesture:UIGestureRecognizer){
let tappedView:UIView = gesture.view!
switch (tappedView.tag)
{
case 1:
let requestURL = prepare4SQrequest(withLocation: currentLocation)
let request = Alamofire.request(.GET, requestURL)
request.progress({bytesRead, totalBytesRead, totalBytesExpectedToRead in
dispatch_async(dispatch_get_main_queue()) {
print("Total bytes to read : \(totalBytesExpectedToRead)")
print("Total bytes read \(totalBytesRead)")
print("Bytes read \(bytesRead)")
self.animate(tappedView)
}
} )
request.responseJSON{ response in
HANDLE REQUEST RESPONSE LOGIC
}
break
}
Любая помощь будет оценена.
Спасибо
1 ответ
Ваша функция buttonTapped должна выглядеть следующим образом
func buttonTapped(gesture:UIGestureRecognizer) {
// 1 do your setup and switch case
// 2 first ask alamofire to send request
Alamofire.request(.GET, requestURL).
responseJSON {
response in
// handle response here
stopAnimation()
}
// 3 call your animation
animate(tappedView)
}
Теперь, если вы установите точку останова на animate (tappedView) и код, который обрабатывает ответ json, вы увидите, что ваш отладчик сначала остановится на animate, а затем через некоторое время остановится на коде ответа. Alamofire имеет встроенную логику многопоточности, поэтому вы просите его извлечь что-то из сети, а затем он выполняет код, который вы передали в закрытии, для.response, когда он будет готов.
Надеюсь, это поможет!