Я пишу немного сложную анимацию, которая состоит из 2 шагов:
- Измените непрозрачность на 0 из
UIViews
, которые не должны быть видимыми, и переместитеUIImageView
(который имеетalpha = 1
) в другоеCGPoint
(положение). - Измените непрозрачность другого
UIView
на 1 и непрозрачностьUIImageView
из предыдущего шага на 0, а затем после завершения анимации этого шага удалитеUIImageView
из супервизора.
Я сделал это так:
Первый шаг выполняется без явной CATransaction. Для этих двух анимаций beginTime
установлено значение CACurrentMediaTime()
. И я применяю изменения к представлениям сразу после layer.addAnimation(...)
вызова. Здесь все отлично работает.
В реализации второго шага я вызываю CATransaction.begin()
в начале. Внутри begin/commit
вызовов CATransaction
я создаю и добавляю 2 CABasicAnimations
к двум разным слоям: один для изменения непрозрачности с 0 на 1 (для UIView
), а второй для изменения непрозрачности с 1 на 0 (для UIImageView
). Для обеих анимаций beginTime
установлено значение CACurrentMediaTime() + durationOfThePreviousStep
.
И сразу после CATransaction.begin()
я вызываю CATransaction.setCompletionBlock({...})
, и в этом блоке завершения я применяю изменения к этим двум представлениям: устанавливаю их новые альфы и удаляю UIImageView
из супервизора.
Проблема в том, что в конце всей этой анимации UIView
с альфа-анимацией до 1 мигает, что означает, что его альфа возвращается к 0 (хотя я установил его альфа в 1 в блоке завершения) и сразу после этого завершение блок выполняется, и его альфа снова увеличивается до 1.
Ну и вопрос, как избавиться от этой перепрошивки? Может, эту анимацию можно сделать лучше?
P.S. Я не использую UIView
анимацию, потому что меня интересуют специальные функции времени для этих анимаций.
ИЗМЕНИТЬ 1: вот код. Я удалил UIImageView
альфа-анимацию, потому что в этом нет особой необходимости.
var totalDuration: CFTimeInterval = 0.0
// Alpha animations.
let alphaAnimation = CABasicAnimation()
alphaAnimation.keyPath = "opacity"
alphaAnimation.fromValue = 1
alphaAnimation.toValue = 0
alphaAnimation.beginTime = CACurrentMediaTime()
alphaAnimation.duration = 0.15
let alphaAnimationName = "viewsFadeOut"
view1.layer.addAnimation(alphaAnimation, forKey: alphaAnimationName)
view1.alpha = 0
view2.layer.addAnimation(alphaAnimation, forKey: alphaAnimationName)
view2.alpha = 0
view3.layer.addAnimation(alphaAnimation, forKey: alphaAnimationName)
view3.alpha = 0
view4.layer.addAnimation(alphaAnimation, forKey: alphaAnimationName)
view4.alpha = 0
// Image View moving animation.
// Add to total duration.
let rect = /* getting rect */
let newImagePosition = view.convertPoint(CGPoint(x: CGRectGetMidX(rect), y: CGRectGetMidY(rect)), fromView: timeView)
let imageAnimation = CABasicAnimation()
imageAnimation.keyPath = "position"
imageAnimation.fromValue = NSValue(CGPoint: imageView!.layer.position)
imageAnimation.toValue = NSValue(CGPoint: newImagePosition)
imageAnimation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionDefault)
imageAnimation.beginTime = CACurrentMediaTime()
imageAnimation.duration = 0.3
imageView!.layer.addAnimation(imageAnimation, forKey: "moveImage")
imageView!.center = newImagePosition
totalDuration += imageAnimation.duration
// Time View alpha.
CATransaction.begin()
CATransaction.setCompletionBlock {
self.timeView.alpha = 1
self.imageView!.removeFromSuperview()
self.imageView = nil
}
let beginTime = CACurrentMediaTime() + totalDuration
let duration = 0.3
alphaAnimation.fromValue = 0
alphaAnimation.toValue = 1
alphaAnimation.beginTime = beginTime
alphaAnimation.duration = duration
timeView.layer.addAnimation(alphaAnimation, forKey: "timeViewFadeIn")
/* imageView alpha animation is not necessary, so I removed it */
CATransaction.commit()
ИЗМЕНИТЬ 2: фрагмент кода, вызывающий проблему:
CATransaction.begin()
CATransaction.setCompletionBlock {
self.timeView.alpha = 1
}
let duration = 0.3
let alphaAnimation = CABasicAnimation()
alphaAnimation.keyPath = "opacity"
alphaAnimation.fromValue = 0.0
alphaAnimation.toValue = 1.0
alphaAnimation.duration = duration
timeView.layer.addAnimation(alphaAnimation, forKey: "timeViewFadeIn")
CATransaction.commit()
Возможно, проблема в том, что timeView
имеет UITextField
и UIScrollView
с четырьмя подпредставлениями. Я пытался заменить timeView
снимком timeView
(UIImageView
), но это не помогло.
РЕДАКТИРОВАТЬ 3: новый код. В этом коде timeView
всегда имеет alpha = 1
, и он также анимирует от 0 до 1.
CATransaction.begin()
CATransaction.setCompletionBlock {
self.imageView!.removeFromSuperview()
self.imageView = nil
}
let alphaAnimation = CABasicAnimation()
alphaAnimation.keyPath = "opacity"
alphaAnimation.fromValue = 0.0
alphaAnimation.toValue = 1.0
alphaAnimation.duration = 0.3
alphaAnimation.beginTime = beginTime
timeView.layer.addAnimation(alphaAnimation, forKey: "timeViewFadeIn")
timeView.alpha = 1.0
CATransaction.commit()
timeView
- это тот, который мигает. Да, вы можете удалить другой код, но мне это не помогло. Он все еще мигает. - person Randex   schedule 24.05.2015