Реверсивный UIViewPropertyAnimator вызывает проблему анимации кадра
Я использую UIViewPropertyAnimator
оживить кадр UICollectionViewCell
, Я смотрю на скорость распознавания жестов панорамирования, чтобы решить, должен ли аниматор закончить естественным образом или повернуть вспять и вернуться в исходное состояние.
Во всех симуляторах на моем iPhone 5s и 6s + эти анимации работают безупречно. На моем iPhone 7+, однако, я получаю странное мерцание кадра, когда я переворачиваю анимацию. Смотрите код ниже, как я это делаю. Эффект на iPhone 7+ заключается в том, что, как только я установил reversed = YES
а затем позвоните continueAnimationWithTimingParameters:durationFactor:
кадр сразу переходит на совершенно другую часть экрана, а затем запускает обратную анимацию оттуда. Только после завершения анимации кадр возвращается к тому месту, куда он должен был вернуться.
Я пытался отменить использование параметров синхронизации пружины, но это не имело значения.
Это абстрактная версия кода:
- (void)prepareAnimation {
// Called when user begins panning in certain direction
// ...
self.cardFrameAnimator = [[UIViewPropertyAnimator alloc] initWithDuration:0.5 dampingRatio:0.8 animations:^{
[self currentCell].frame = targetFrame;
}];
}
- (void)panningEndedWithTranslation:(CGPoint)translation velocity:(CGPoint)velocity
{
if (self.cardFrameAnimator.isRunning)
{
return;
}
CGFloat screenHeight = [[UIScreen mainScreen] bounds].size.height;
CGVector velocityVector = CGVectorMake(velocity.x / 500, velocity.y / 500);
__weak CardStackCollectionViewController *weakSelf = self;
switch (self.currentState) {
case CurrentStateStacked:
if (translation.y <= -screenHeight / 3 || velocity.y <= -100)
{
// Let the animation run to completion
self.cardFrameAnimator.reversed = NO;
[self setCurrentCellsCornerRadius:0];
[self.cardFrameAnimator addCompletion:^(UIViewAnimatingPosition finalPosition) {
weakSelf.activeCellState = CurrentStateFullscreen;
}];
}
else
{
// Revert the animation back to the default state
self.cardFrameAnimator.reversed = YES;
[self setCurrentCellsCornerRadius:20];
[self.cardFrameAnimator addCompletion:^(UIViewAnimatingPosition finalPosition) {
weakSelf.activeCellState = CurrentStateStacked;
}];
}
break;
case CurrentStateFullscreen:
if (translation.y >= screenHeight / 3 || velocity.y >= 100)
{
// Let the animation run to completion
self.cardFrameAnimator.reversed = NO;
[self setCurrentCellsCornerRadius:20];
[self.cardFrameAnimator addCompletion:^(UIViewAnimatingPosition finalPosition) {
weakSelf.activeCellState = CurrentStateStacked;
}];
}
else
{
// Revert the animation back to the default state
self.cardFrameAnimator.reversed = YES;
[self setCurrentCellsCornerRadius:0];
[self.cardFrameAnimator addCompletion:^(UIViewAnimatingPosition finalPosition) {
weakSelf.activeCellState = CurrentCellStateFullscreen;
}];
}
break;
}
UISpringTimingParameters *springParameters = [[UISpringTimingParameters alloc] initWithDampingRatio:0.8 initialVelocity:velocityVector];
[self.cardFrameAnimator continueAnimationWithTimingParameters:springParameters durationFactor:1.0];
}