UILabel 的动画帧平滑

Posted

技术标签:

【中文标题】UILabel 的动画帧平滑【英文标题】:Animating Frame of UILabel smoothly 【发布时间】:2009-11-13 14:35:49 【问题描述】:

我一直在尝试找出一种体面的方法来平滑地为 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];  

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

动画前

动画后

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

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

感谢您的帮助, 斯科特

【问题讨论】:

这是一个老问题,但我正在与完全相同的问题作斗争。不知何故,这是不合逻辑的。据我了解动画方法,您应该能够为 UIView 类上的大多数属性设置动画。但是为什么 UILabel 的 frame 属性在动画时的行为与普通的 UIView 子类不同。看起来 UILabel 类忽略了大小的动画,只对位置变化进行动画处理。这会创建一个看起来很奇怪的动画。如果有人可以帮助我,我将不胜感激。 【参考方案1】:

很高兴回答了一个两年前的死问题,但我找到了答案。在 Interface Builder 或代码中,更改标签的 contentMode 属性。你的似乎设置在scaleToFill;试试leftright

【讨论】:

如果可以的话,我会把这个答案加 100! (有时还是会跳,不过没关系) TopLeft/Right 或 BottomLeft/Right 可能是您想要的正确 contentMode,具体取决于您需要的确切动画。 它救了我的命 :) 这个答案 100% 有效,但为了更清楚一点,如果我的 .textAlignment.center,如:myLabel.textAlignment = .center,那么将 .contentMode 设置为:myLabel.contentMode = .center跨度> 【参考方案2】:

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

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

来自 UIView 的 contentMode 属性的文档:

此属性的默认值为 UIViewContentModeScaleToFill。

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

【讨论】:

【参考方案3】:

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

初始帧:

动画期间:

动画结束:

【讨论】:

我不敢相信我从来不知道关于 UILabel 的事情。但是你帮我解决了一个让我完全难过的问题 - 谢谢!【参考方案4】:

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

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

【讨论】:

其实不是这样的。此处未设置adjustFontSizeToFitWidth,我实际上试图更改字体大小,只是框架-黄色。然而,发生的情况是 dest 帧(在这种情况下)“适合”文本,因此它首先重绘该图层,将其拉伸以适合原始帧,然后缩小它。这就是为什么它看起来很奇怪。 那么不确定。这是一个有趣的问题。今天晚些时候我会看看我是否不能复制它。我自己也很好奇。【参考方案5】:

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

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

【讨论】:

以上是关于UILabel 的动画帧平滑的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 Swift 为 UILabel 设置动画

动画 UIView setFrame 在每个动画帧上强制 drawRect

swift中UILabel的彩色动画

*只有一个*动画块(UILabel)使用自动布局的问题

在 UITableViewCell 内动画 UILabel 文本更改

动画改变 UILabel 的行数