user472292
user472292

Reputation: 329

CAAnimation - User Input Disabled

I am trying to animate a button. When I do so (using button.layer addAnimation) the button becomes disabled. Is there any way to allow user interaction when animating? I also tried wrapping everything in a block using animateWithDuration passing in the option UIViewAnimationOptionAllowUserInteraction, but it still doesn't work.

EDIT: It's odd. If I click in the upper corner (where I placed my button) it fires off the event. It's almost like the frame of the button does not follow the animation.

EDIT: What I ended up doing is create an event that fires every 0.1 seconds that sets the button.frame equal to the [[button.layer presentationLayer] frame]. That seemed to do the trick.

Upvotes: 0

Views: 1588

Answers (5)

Mejdi Lassidi
Mejdi Lassidi

Reputation: 999

the best solution is to change the position of the layer after you call the animation:

[button.layer addAnimation:animation forKey:@"animation"];

 button.layer.position = endPosition;

Upvotes: 1

Xazen
Xazen

Reputation: 822

I wanted the button to zoom in. So I scale down the layer before I start the animation:

layer.transform = CATransform3DScale (layer.transform, 0.01, 0.01, 0.01);

// some animation code

After the animation I scaled it back.

// some animation code
CATransform3D endingScale = CATransform3DScale (layer.transform, 100, 100, 100);
// some animation code

[layer addAnimation:animation forKey:@"transform"];

layer.transform = endingScale;

Looks like if you directly assign it to the layer the frame will change. However using an animation won't change the frame.

Upvotes: 0

Thomas Rued
Thomas Rued

Reputation: 1

To me the event firing seemed a bit hacky.
However your mentioning of the [[button.layer presentationLayer] frame] brought me onto the right track :-)

So by attaching a gesture recognizer to the superview of the moving view I can do the following detection:

CGPoint tapLocation = [gestureRecognizer locationInView:self.view];

for (UIView* childView in self.view.subviews)
{
    CGRect frame = [[childView.layer presentationLayer] frame];
    if (CGRectContainsPoint(frame, tapLocation))
    {
        ....
    }
}

Upvotes: 0

user472292
user472292

Reputation: 329

What I ended up doing is create an event that fires every 0.1 seconds that sets the button.frame equal to the button.layer

Upvotes: 0

EricS
EricS

Reputation: 9768

Use the following UIView method with UIViewAnimationOptionAllowUserInteraction in the UIViewAnimationOptions parameter:

+(void)animateWithDuration:(NSTimeInterval)duration delay:(NSTimeInterval)delay options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion

Upvotes: 1

Related Questions