我一直试图想出一种在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];
我得到一个带有标签的平滑动画,然而它的方式是它将重绘的图像层用于标签的目标大小并拉伸内容以适应当前的动画到目标矩形。这最终会在文本显示中出现非常奇怪的跳跃。这里有两个图像显示动画前的外观,然后在动画开始后:
预动画
后动画
我试图仅使用图层来设置动画,但我仍然遇到同样的问题。
所以问题是,我该如何避免这种情况?
感谢您的帮助,
斯科特
答案 0 :(得分:33)
contentMode
属性。你的似乎是scaleToFill
;试试left
或right
。
答案 1 :(得分:7)
扩展@ cliclcly的回答:来自UILabel的文档概述:
UILabel类的默认内容模式是 UIViewContentModeRedraw。此模式会导致视图重绘 每次其边界矩形改变时的内容。你可以改变 此模式通过修改继承的contentMode属性 类。
来自UIView的contentMode属性的文档:
此属性的默认值为UIViewContentModeScaleToFill。
默认情况下,UILabels的行为与其他UIViews不同,因为默认情况下它们的contentMode属性不同。
答案 2 :(得分:5)
我发现UIlabel框架动画很奇怪 - 它们的大小立即设置为最终大小,并且文本是针对该大小呈现的。之后,只有位置更改是动画的,这意味着如果目标大小为(0,0),则标签会立即消失。 为了避免这种限制,我将标签放在一个大小与视图子视图相同的视图中,禁用了标签的自动调整,我正在为标签的超视图而不是标签本身设置动画。 最终结果是标签框架在整个过程中都是完全动画的,但是所包含的文本不会使用不同的字体大小重新渲染,也不会更改文本截断。 它仍然不完美,但它符合我的目的。
初始框架:
动画期间:
动画结束:
答案 3 :(得分:0)
动画框不会动画更改字体大小。如果我理解你所看到的行为,我认为你将标签的adjustsFontSizeToFitWidth
设置为'True',这样你就可以看到框架的大小是动画的,然后是字体大小的瞬时重新调整。
您可能会尝试缩放标签的变换,以便框架和字体同时缩放。
答案 4 :(得分:-3)
只需关闭标签的自动布局即可。
在Xcode中,单击标签,然后在属性窗格中取消选中自动布局选项