Orpheus Mercury
Orpheus Mercury

Reputation: 1627

UILabel disappears after animateWithDuration

I've got a UILabel that slides in and out of view, but after it slides back in it disappears. I want it to persist.

How can I achieve this? Also, why does this happen?

Here's the code:

[UIView animateWithDuration:0.1
                          delay:0.0
                        options:UIViewAnimationOptionAutoreverse
                     animations:^{
                         [self.listLabel setFrame:CGRectMake(325, 141, 320, 181)];
                     }
                     completion:nil];

Thanks.

Upvotes: 2

Views: 1344

Answers (4)

Florian Pfisterer
Florian Pfisterer

Reputation: 1265

As there still seems to be no valid answer, I propose a (now possible) approach:

In Xcode 6, with the app running in the simulator, go to "Debug" in the top bar, select "View Debugging" and "Capture View Hierarchy". Then go and search your missing Label. You can also see properties etc. of the Label in the right Xcode bar.

Upvotes: 0

Chao Zhang
Chao Zhang

Reputation: 1534

In official documentation

UIViewAnimationOptionAutoreverse Run the animation backwards and forwards. Must be combined with the UIViewAnimationOptionRepeat option.

Upvotes: 2

Christopher Pickslay
Christopher Pickslay

Reputation: 17762

UIViewAnimationOptionAutoreverse is designed for a cyclical animation. To just bounce something offscreen and back, you should just write it as 2 animations:

CGRect originalFrame = self.listLabel.frame;
[UIView animateWithDuration:0.05
                      delay:0.0
                    options:UIViewAnimationOptionLayoutSubviews
                 animations:^{
                     [self.listLabel setFrame:CGRectMake(325, 141, 320, 181)];
                 }
                 completion:^(BOOL finished){
                    [UIView animateWithDuration:0.05
                                          delay:0.0
                                        options:UIViewAnimationOptionLayoutSubviews
                                     animations:^{
                                         [self.listLabel setFrame:originalFrame];
                                     }
                                     completion:nil];
                 }
 ];

Upvotes: 0

Humayun Ghani
Humayun Ghani

Reputation: 1

Why don't you use UIViewAnimationOptionCurveEaseOut and UIViewAnimationOptionCurveEaseIn animation option for your label? Just set your label's frame.origin.x = [outside the right side of it's superview's bound] and set it back to it's original position when you want to slide-In again using EasyOut animation. Here's something what I'm talking about...

CFRect frame = self.listLabel.frame;
//Point to hide your label by sliding it outside the right side of it's parent's view.
// mask or clipToBounds of parent's view must be YES
frame.origin.x = [self.listLabel.superview.frame.size.width]; 
[UIView animateWithDuration:0.1
                      delay:0.0
                    options:UIViewAnimationOptionCurveEaseIn
                 animations:^{
                     [self.listLabel setFrame:frame];
                 }
                 completion:nil];

And When you want to slide back in, use opposite animation and label's original position, of course you need to store it's original position somewhere so you could slide-in it back.

 [UIView animateWithDuration:0.1
                      delay:0.0
                    options:UIViewAnimationOptionCurveEaseOut
                 animations:^{
                     [self.listLabel setFrame:label_original_frame];
                 }
                 completion:nil];

Upvotes: 0

Related Questions