我正在尝试为UIlabel设置动画以首先变大,然后缩小回原始帧。扩大工作按预期,但不缩小。当我用下面的代码收缩标签时,尺寸会在原点移动之前先调整。这会导致两步动画不顺畅。
这是我的代码:
CGRect rect = label.frame;
[UIView animateWithDuration:.2
delay: 0.1
options: UIViewAnimationOptionBeginFromCurrentState
animations:^{
label.frame = CGRectMake(rect.origin.x + 4,
rect.origin.y + 4,
rect.size.width-8,
rect.size.height-8);
}
completion:^(BOOL finished){
}];
答案 0 :(得分:2)
您可以尝试将变换应用于动画块内的标签,而不是调整矩形。类似于增长/缩小动画的以下行:
label.transform = CGAffineTransformMakeScale(1.5, 1.5); //grow
label.transform = CGAffineTransformMakeScale(1, 1); //shrink
答案 1 :(得分:2)
请尝试这个解决方案,我想这正是你要找的。我已经测试了它的工作情况,但如果你正在寻找这个,请试着让我知道。
-(IBAction)growanimate:(id)sender
{
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:1];
[UIView setAnimationCurve:UIViewAnimationCurveLinear];
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(shrinkanimate)];
label.transform = CGAffineTransformMakeScale(2.0f, 2.0f); //This will double label from current size.
[UIView commitAnimations];
}
-(void)shrinkanimate
{
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:1];
[UIView setAnimationCurve:UIViewAnimationCurveLinear];
label.transform = CGAffineTransformMakeScale(1.0f, 1.0f); //This will get it back to original size.
[UIView commitAnimations];
}
答案 2 :(得分:1)
我猜问题是由于调整帧大小会触发调整大小通知这一事实。在缩小时可能会有更多的中断因为超级视图的新区域被揭示出来。
在这种情况下,转换方法要好得多。
我还猜测,使用transform方法,字符路径和布局(换行符等等)不会重新计算,缓存的CGPath只是在渲染时进行转换。
关于居中问题,我没有看到任何问题。
我想补充一点,如果你打算大量使用这个效果,你可以为这个效果创建一个静态类,或者包含几个预设的动画,里面有静态存储的变换。
然后你打电话[MyPopEffect popView:mylabel];
它可以避免创建和发布转换,并允许即时使用任何视图或其他项目。
无论如何,这是动画代码......干杯
[
UIView animateWithDuration:0.5f delay: 0.0f
options:UIViewAnimationOptionCurveEaseOut+UIViewAnimationOptionBeginFromCurrentState
animations:^{
label.transform=CGAffineTransformMakeScale(2.0f,2.0f);
}
completion:^(BOOL finished){
[UIView animateWithDuration:0.5f delay: 0.0f
options:UIViewAnimationOptionCurveEaseIn+UIViewAnimationOptionBeginFromCurrentState
animations:^{
label.transform=CGAffineTransformMakeScale(1.0f,1.0f);
}
completion:^(BOOL finished){}];
}];