10

我一直在尝试找出一种体面的方法来平滑地为 UILabel 上的帧大小更改设置动画,而不会出现奇怪的开始跳转重绘。默认情况下,当我执行以下操作时:

// Assume myLabel frame starts as (0, 0, 100, 200) 
[UIView beginAnimations:@"myAnim" context:NULL];
[UIView setAnimationBeginsFromCurrentState:YES];
[UIView setAnimationCurve:UIViewAnimationCurveLinear];
[UIView setAnimationDuration:1.0];
myLabel.frame = CGRectMake(0.0, 0.0, 50, 100);
[UIView commitAnimations];  

我得到了一个带有标签的平滑动画,但是它的方式是将重绘的图像层用于标签的目标大小并拉伸内容以适应当前然后动画到目标矩形。这最终在文本显示中出现了一个非常奇怪的跳跃。这是两张显示动画前外观的图像,然后是动画开始后的样子:

预动画

动画后

我试图只使用图层来制作动画,但我仍然遇到同样的问题。

所以问题是,我怎样才能避免这种情况?

感谢您的帮助,
斯科特

4

5 回答 5

38

万岁回答一个两年死的问题,但我找到了答案。在 Interface Builder 或代码中,更改contentMode标签的属性。您的似乎已设置为scaleToFill; 尝试leftright

于 2011-07-06T20:42:50.817 回答
7

要扩展@cliclcly 的答案:来自 UILabel 文档的概述:

UILabel 类的默认内容模式是 UIViewContentModeRedraw。此模式会导致视图在每次其边界矩形更改时重绘其内容。您可以通过修改类的继承 contentMode 属性来更改此模式。

从 UIView 的 contentMode 属性的文档中:

此属性的默认值为 UIViewContentModeScaleToFill。

默认情况下,UILabels 的行为与其他 UIView 不同,因为它们的 contentMode 属性默认情况下是不同的。

于 2012-10-02T00:53:19.017 回答
6

我发现 UIlabel 帧动画很奇怪 - 它们的大小立即设置为最终大小,并且文本以该大小呈现。之后,只有位置变化被动画化,这意味着如果目标大小为 (0,0),则标签立即消失。为了规避这个限制,我将标签放置在与剪辑子视图相同大小的视图中,禁用了标签的自动调整大小,并且我正在为标签的超级视图而不是标签本身设置动画。最终结果是标签框架在整个过程中都是完全动画的,但包含的文本不会重新渲染,例如不同的字体大小,文本截断也不会改变。它仍然不完美,但它适合我的目的。

初始帧:

初始帧

动画期间:

动画期间

动画结束:

动画结束

于 2014-03-06T12:32:08.467 回答
0

动画框架不会动画更改字体大小。如果我了解您所看到的行为,我认为您已将标签adjustsFontSizeToFitWidth设置为“真”,因此您会看到帧动画大小,然后立即重新调整字体大小。

您可能会尝试缩放标签的变换,以便框架和字体同时缩放。

于 2009-11-13T15:58:52.673 回答
-3

只需关闭标签的自动布局即可。

在 Xcode 中,单击标签,然后在属性窗格中,取消选中自动布局选项

于 2013-12-23T18:39:22.677 回答