1
votes

So there seems to be an issue with animating size transformations for UIButtons. Specifically, if you have a button of type UIButtonTypeCustom, any frame size transformations happen instantly. Movement and other animations happen as normal.

Does anyone have a good fix for this? I'm guessing that it's because the custom buttons contain images, and something is going wrong when UIView calculates its transformations.

This guy seems to have found the same problem, but no workaround.

Here's an example. The image origin will move smoothly from 0.0,0.0 to 100.0,100.0 over two seconds, but the size instantly jumps to 200x200.

UIButton *tButton = [UIButton buttonWithType:UIButtonTypeCustom];
[tButton setBackgroundImage:tImage forState:UIControlStateNormal];
tButton.frame = CGRectMake(0.0, 0.0, 10.0, 10.0);

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationBeginsFromCurrentState:YES];
[UIView setAnimationDuration:2.0];

tButton.frame = CGRectMake(100.0, 100.0, 200.0, 200.0);

[UIView commitAnimations];
1
actually, the bug starts to show up after calling setBackgroundImage:, looks like its type makes no difference. you can test it by setting the contents property of button's layer to desired image (you'll need to #import <QuartzCore/QuartzCore.h> and add QuartzCore.framework): tButton.layer.contents = (id)tImage.CGImage; while leaving its type set to UIButtonTypeCustom and removing a call to setBackgroundImage:Russian
@Russian - Interesting... I wonder if the button frame is actually animating smoothly, but the image itself resizes instantly and just overdraws. I'll have to test that.DougW

1 Answers

0
votes

Credit goes to davbryn for this answer but instead of redefining the frame you use:

button.transform = CGAffineTransformMakeScale(1.5,1.5);

Its not as easy as just using a new frame so you will have to play around with the it but it should get you pointed in the right direction.