iOS - 如何在UILabel或UITextView中实现文字大小变化的动画效果?

8
在一个显示文本块的应用程序中,当设备旋转到横屏方向时,我希望字体大小增加。但我不喜欢它完成整个动画然后突然跳到新的大小,所以我想在旋转过程中通过动画来改变字体大小。
我看到有人说将这种更改放入UIView动画块中是行不通的,因为字体属性是不可动画的。那么我可以怎样做呢?
针对我的具体实现,我不仅仅是按原样缩放UILabel/UITextView;盒子的边界比字体大小增加得更多(成比例),因此文本会重新流动。这对我来说没问题。
另外,我正在考虑手动“动画”它:我有一个方法来布置我的视图并调整字体大小。如果我知道何时开始旋转和动画持续时间,我可以计时,使其在动画中间呈现出一个中间字体大小或两个中间字体大小。帮助我获得这些内容将不胜感激。

1
你已经成功实现了你想做的事情吗?你可以接受其中一个答案来关闭问题吗? - MiKL
4个回答

7

一种选择是将旧文本淡出,改变字体大小,然后再淡入。虽然字体属性可能无法进行动画处理,但透明度可以。由于透明度是UIView的属性,因此您可以以相同的方式处理所有带有文本的视图:UILabel、UITextView等。这看起来也很好。


6

如果我知道旋转何时开始以及动画的持续时间...

有趣的是你提到了这个。在动画开始之前,你的视图控制器将收到一个willAnimateRotationToInterfaceOrientation:duration:消息,它会给你所需的确切信息。


4
一种实现方法如下:
  1. 创建一个CAKeyframeAnimation对象
  2. 使用一组CATransform3D对象定义您希望在动画期间实现的缩放和旋转效果
  3. 将这些变换添加到您的关键帧动画中
  4. 向您的标签层对象发送addAnimation消息:[[label layer] addAnimation];
假设yourLabel是您想要缩放和旋转的UILabel,下面是示例代码:
CAKeyframeAnimation *scale = [CAKeyframeAnimation animationWithKeyPath:@"transform"];

CATransform3D scaleUp = CATransform3DMakeScale(1.5, 1.5, 1); // Scale in x and y
CATransform3D rotationScaled = CATransform3DRotate (scaleUp, 90, 0, 0, 1); // Rotate the scaled font

[scale setValues:[NSArray arrayWithObjects:
[NSValue valueWithCATransform3D:CATransform3DIdentity],
[NSValue valueWithCATransform3D:rotationScaled],
nil]];

// set the duration
[scale setDuration: 1.0];

// animate your label layer
[[yourLabel layer] addAnimation:scale forKey:@"scaleText"];

例如,通常文本弹跳的动画效果是这样实现的。

您可以在设备开始旋转时启动此操作,并在设备停止旋转后检索动画,以便您可以使用适当的比例/位置更新标签。

您需要进行微调以找到合适的时间和旋转方式。


@kelso。你有想过/尝试过这个吗? - MiKL
为了获得正确的时间和正确的旋转,您可以使用上述描述的方法:willAnimateRotationToInterfaceOrientation:duration: - MiKL
@kelso.b,你最终实现了你想要达到的目标了吗?接受一个答案作为好的答案,这样你的问题就可以被关闭了,如何?祝好。Mikl - MiKL

1
当调用didAnimateFirstHalfOfRotationToInterfaceOrientation:时更改字体大小。这样用户就不会在旋转完成后看到变化。因为旋转正在发生,所以很难看到字体大小的变化!

除非您启用了双步动画,否则该方法不会被调用,这需要额外的手动操作,我真的不想涉及。但是无论如何都是个好主意! - kbanman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接