UILabel的动画帧平滑过渡

11

我一直在试图找到一种合适的方式,平滑地对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];  
我得到了一个带标签的平滑动画,但是它实现的方式是将重绘的图像层用作标签目标大小,并将内容拉伸以适应当前大小,然后动画到目标矩形。这最终导致了文本显示中非常奇怪的跳跃。以下是两张图片,展示了动画前的外观以及动画开始后的样子:

动画前

动画后

我尝试只使用图层来实现此动画,但仍然遇到相同的问题。

所以问题是,我该如何解决这个问题?

感谢任何帮助,
Scott


1
这是一个老问题,但我正在与完全相同的问题作斗争。不知何故它是不合逻辑的。据我所了解的动画方法,您应该能够对UIView类上的大多数属性进行动画处理。但是为什么UILabel的frame属性在动画处理时会与普通的UIView子类不同呢?看起来像是UILabel类忽略了尺寸的动画处理,仅对位置变化进行了动画处理。这会产生一种相当奇怪的动画效果。如果有人能帮助我解决这个问题,我将不胜感激。 - Chris
5个回答

41

太好了,虽然这是一个两年前的问题,但我找到了答案。可以在Interface Builder或者代码中修改标签的contentMode属性。你的可能设置为scaleToFill;尝试使用leftright


1
如果可以的话,我会用100个赞来点赞这个回答!(有时候还是会出现一些问题,但没关系) - Ariel
根据您需要的确切动画效果,TopLeft/Right或BottomLeft/Right可能是您想要的正确contentMode。 - CedricSoubrie
1
它救了我的命 :) - Dmitry
2
这个答案是百分之百有效的,但为了更清晰一些,如果我的.textAlignment.center,就像这样:myLabel.textAlignment = .center,那么将.contentMode设置为:myLabel.contentMode = .center - Lance Samaria

7
我发现UIlabel的框架动画很奇怪 - 它们的大小立即设置为最终大小,并且文本是根据该大小渲染的。之后只有位置改变是被动画化的,这意味着如果目标大小是(0,0),那么标签会立即消失。
为了规避这个限制,我将标签放在大小相同的视图中,裁剪子视图,禁用标签的自动调整大小,并对标签的父视图进行动画处理,而不是对标签本身进行动画处理。
最终结果是整个标签框架都得到了完全的动画处理,但包含的文本并没有以不同的字体大小重新渲染,也不会改变文本截断。
虽然还不完美,但已经适合我的需求。

初始框架:

初始框架

正在动画过程中:

正在动画过程中

动画结束:

动画结束


我简直不敢相信我以前从未了解过UILabels的这个知识点。但是你帮助我解决了一个让我完全困惑的问题 - 谢谢! - Echelon

7
为了解释@cliclcly的回答,从UILabel的概述文档中可以看到:默认情况下,UILabel类的内容模式是UIViewContentModeRedraw。这种模式会使视图在其边界矩形发生变化时重新绘制其内容。您可以通过修改该类的继承contentMode属性来更改此模式。
从UIView的contentMode属性文档中可以看到:该属性的默认值为UIViewContentModeScaleToFill。
默认情况下,UILabel的内容模式与其他UIView不同,因为它们的contentMode属性默认不同。

0

动画帧不会使字体大小发生变化。如果我理解你所看到的行为,我认为你将标签的adjustsFontSizeToFitWidth设置为“True”,因此你会看到帧动画到大小,然后立即重新调整字体大小。

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


1
实际上不是这样的情况。在这里没有设置adjustFontSizeToFitWidth,我实际上并不想改变字体大小,只是想改变框架——它是黄色的。然而会发生的事情是,目标框架(在这种情况下)“适应”文本,所以它首先重新绘制那个图层并将其拉伸以适应原始框架,然后缩小它。这就是为什么它看起来像这样奇怪的原因。 - Scott Little
不确定。这是一个有趣的问题。我会看看今天晚些时候能否重现它。我自己也很好奇。 - TechZen

-3

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

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


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