Drew
Drew

Reputation: 1452

View not animating with Autolayout

I've been searching around SO and have found some related posts, but none that have (yet) solved my problem.

I have a view setup in my storyboard, with a constraint hooked up through an IBOulet. Upon a certain action, the view should move up (or down to it's initial position). For the life of me, I cannot get it to work properly. Prior to autolayout, I ran this bit of code:

- (void)animateStarBackground:(NSString *)animationID
                 finished:(NSNumber *)finished
                  context:(void *)context
                   myView:(UIView *)myView
                     xPos:(float)xPos
                     yPos:(float)yPos {

    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:0.2];
    [UIView setAnimationDelay:0.5];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
    [UIView setAnimationDelegate:self];

    myView.center = CGPointMake(xPos, yPos);

[UIView commitAnimations];

}

It used to work great, but anyway... we all know that this doesn't work in Autolayout anymore. So I changed it to the following:

-(void)animateButton:(UIView *)myView {

    [UIView animateWithDuration:8.0f animations:^{
        _viewConstA.constant = 45.0;
        [myView layoutIfNeeded];
    }];

}

When the action occurs, instead of starting in it's initial position as set in the Storyboard, it starts off as a 1x1 pixel view in the top left hand corner and animates downward into it's final resting place (instead of moving up 15 pixels as I had intended it to).

Now, if I take out the [myView layoutIfNeeded]; portion, the action positions the view in exactly the right place... BUT it doesn't animate there. It's just instantly there as the view appears.

The first screen grab is the initial location. 2nd grab is what's supposed to be the views final resting place. 3rd is the view animating from the wrong spot and direction.

Thoughts / comments? What the heck am I doing wrong? I thought this would be so easy... I've got to be missing something obvious.

enter image description here

enter image description here

enter image description here

Upvotes: 3

Views: 4139

Answers (1)

Rob
Rob

Reputation: 438232

When I call the following block-based animation from viewDidLoad, it animates the frame from CGRectZero to the final location. But if I call this from viewDidAppear, it works just as expected.

- (void)animateMovementByConstraint
{
    [UIView animateWithDuration:0.5
                     animations:^{
                         self.topLayoutConstraint.constant = 100;
                         [self.view layoutIfNeeded];
                     }];
}

(In this example, topLayoutConstraint is an IBOutlet that I defined in Interface Builder for the top vertical constraint on the control that I wanted to animate.)

With auto layout, since I've started initiating my animations in viewDidAppear, I haven't had any problems.

Upvotes: 6

Related Questions