I have worked with UIView animation recently. Task was to move one object from one position to another. As I will also need to rotate object further I decided to use transform parameter instead of frame. I made a small demo, where UIView moves to touch position.

                        
                            @interface ViewController (){
                                UIView* _view;
                            }
                            @end

                            @implementation ViewController

                            - (void)viewDidLoad {
                                [super viewDidLoad];
                                _view = [[UIView alloc] initWithFrame:CGRectMake(-50, -50, 100, 100)];
                                _view.backgroundColor = [UIColor blackColor];
                                [self.view addSubview:_view];
                            }

                            -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
                            {
                                for (UITouch *touch in touches)
                                    {
                                        CGPoint point = [touch locationInView:self.view];
                                        [UIView animateWithDuration:0.5
                                            animations:^{
                                                _view.transform = CGAffineTransformConcat(CGAffineTransformMakeRotation((0.0f * M_PI)/180.0f),
                                                CGAffineTransformMakeTranslation(point.x, point.y));
                                        }];
                                    break;
                                }
                            }
                        
                    

The outcome is pretty obvious:

After that I’ve added 90 degrees clockwise rotation to object on every move.

                        
                            - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
                            {
                                static CGFloat angle = 0.0;
                                angle += 90;
                                for (UITouch *touch in touches)
                                {
                                    CGPoint point = [touch locationInView:self.view];
                                    [UIView animateWithDuration:0.5
                                                animations:^{
                                                _view.transform = CGAffineTransformConcat(CGAffineTransformMakeRotation((angle * M_PI)/180.0f),
                                                                    CGAffineTransformMakeTranslation(point.x, point.y));
                                                }];
                                    break;
                                }
                            }
                        
                    

I was expected something like this:

But reality is this:

First object move from center of coordinates goes as planned. When object is moving to destinationPosition, while rotating on 90 degrees everything looks fine.

When second move started (WithDuration:animations: called) object pops out to another position to start movement.

After some research I’ve found discussion of this problem on Stackoverflow. From this discussion we can learn that apple hasn’t still fix this bug, which lasts from iOS 7. At this moment (iOS 10.2.1) this bug is still there. There are some discussions how to fix it. I was able to fix it using keyframe animation. I have modified my code:

                        
                            - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
                            {
                                static CGFloat angle = 0.0;
                                static CGPoint previouslyPosition;
                                static CGFloat previouslyAngle;
                                angle += 90;
                                for (UITouch *touch in touches)
                                {
                                    CGPoint point = [touch locationInView:self.view];
                                    CGAffineTransform transformSource = CGAffineTransformConcat(CGAffineTransformMakeRotation((previouslyAngle * M_PI)/180.0f),
                                    CGAffineTransformMakeTranslation(previouslyPosition.x, previouslyPosition.y));
                                    CGAffineTransform transformDesctination = CGAffineTransformConcat(CGAffineTransformMakeRotation((angle * M_PI)/180.0f),
                                    CGAffineTransformMakeTranslation(point.x, point.y));
                                    [UIView animateKeyframesWithDuration:0.5
                                        delay:0.0
                                        options:0
                                        animations:^{
                                            [UIView addKeyframeWithRelativeStartTime:0.0 relativeDuration:0.01
                                                animations:^{
                                                    _view.transform = transformSource;
                                        }];

                                    [UIView addKeyframeWithRelativeStartTime:0.01 relativeDuration:0.99
                                        animations:^{
                                            _view.transform = transformDesctination;
                                    }];
                                }
                                    completion:^(BOOL finished){
                                }];
                                    previouslyPosition = point;
                                    previouslyAngle = angle;
                                    break;
                                }
                            }
                        
                    

After those modifications animation runned smoothly, as I have planned.