Вы смешиваете и подбираете парадигмы, и я считаю, что это вызывает проблему, которую вы видите. Вы создаете блок анимации, но внутри этого блока вы создаете новую подпрограмму анимации со «старой» парадигмой для запуска анимаций UIView. Apple уводит людей от старой парадигмы, и я бы посоветовал вам использовать ТОЛЬКО блоки.
Вот почему блок завершения запускается только один раз, код блока UIView animateWith запускается только один раз. Однако ваш внутренний код анимации запускается несколько раз.
Вынуть:
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.7];
[UIView setAnimationRepeatCount:1];
[UIView setAnimationRepeatAutoreverses:NO];
Если вы хотите, чтобы ваш анимационный блок запускался несколько раз, используйте полный метод:
- animateWithDuration: Задержка: опции: анимация: завершение:
Установите задержку = 0 и установите для своих параметров значение UIViewAnimationOptionRepeat, или все, что вам нужно для достижения количества циклов, которое вы хотите, чтобы блок завершил.
Вот мое предложение, если вы хотите, чтобы оно повторилось:
- (IBAction) move
{
[UIView animateWithDuration:0.7
delay:0
options:UIViewAnimationOptionRepeat
animations:^{
CGPoint pos = movingtTable.center;
float moveDistance = 220.0;
if(!isViewVisible) {
//expose the view
pos.y = pos.y+moveDistance;
//disable selection for xy table
xTable.userInteractionEnabled = NO;
yTable.userInteractionEnabled = NO;
//angle = M_PI;
}
else {
pos.y = pos.y-moveDistance;
xTable.userInteractionEnabled = YES;
yTable.userInteractionEnabled = YES;
//angle = -M_PI;
}
isViewVisible = !isViewVisible;
movingtTable.center = pos;
NSLog(@"finished 1st");
}
completion:^(BOOL finished){
NSLog(@"started 2nd");
[UIView animateWithDuration:0.4
animations:^{
arrows.transform = CGAffineTransformMakeRotation(angle);
}
completion:^(BOOL finished){
angle = -angle;
}];
}];
}