UIView动画:视图放大/缩小

5

我有一个UILabel想要动态变化大小。当尺寸改变时,我需要左下角保持静止,以便它始终直接出现在底部工具栏上方。我使用以下代码使标签增长:

[UIView animateWithDuration:kAnimationDuration delay:0.0 options:UIViewAnimationCurveEaseInOut 
                 animations:^{  
    CGFloat lblHeight = 42.0f;
    [label setFrame:CGRectMake(0.0, 
                CGRectGetMaxY(self.view.bounds) - kBottomBarHeight - lblHeight, 
                CGRectGetMaxX(self.view.bounds), 
                lblHeight)];                
} completion:^(BOOL finished) { }];

为了使其缩小,我使用相同的逻辑,只是将lblHeight设置为17.0f。

视图正确增长,但当我尝试缩小它时,框架更改动画不会动画化。它会突然变成新的大小,然后动画化为新的原点/位置。我需要框架更改被动画化。有人看出我做错了什么吗?

2个回答

2

经过一些尝试,我成功地通过以下方式获得了所需的行为。

在扩展方法中,我使用UIView动画来改变框架。 在缩小方法中,我使用UIView动画来更改边界和中心。

我有点困惑为什么这样做可以工作,但使用框架来缩小却不行。如果有人能分享一些见解,那就太好了。


0

你不应该使用框架来进行动画,而是应该使用标签的变换属性。

然而,由于你想让一个角保持静止,我认为最好使用核心动画。 CALayer 有一个叫做 anchorPoint 的属性,它确定图层将围绕哪个点旋转,并且我非常确定它也适用于增长/缩小效果。


4
这个回答有多个问题。1)frame是一个完全可以动画化的属性;2)+animateWithDuration是一个用于UIView的核心动画包装器;3)如果他要操作底层图层的属性,那么锚点才能起作用。 - CodaFi
@CodaFi 是的,Frame是一个完全可动画化的属性,但我也看到过很多它引起问题或奇怪行为的实例。而且我知道锚点只影响图层操作,所以我的建议是摆脱animateWithDuration,使用类似layer.transform = CATransform3DMakeScale(CGFloat sx,CGFloat sy,CGFloat sz)这样的东西。 - Kaan Dedeoglu
是的,但如果消除 + animateWithDuration,他将失去动画效果。此外,他特别提到希望保留视图位置的一个角落,在使用 MakeScale 时,会从中心点缩小/放大。 - CodaFi
不,如果他设置:testLayer.anchorPoint = CGPointMake(1, 0); testLayer.transform = CATransform3DMakeScale(.5, .5, 1);该图层将缩小到一半大小,但其左下角将保持固定。在这种情况下,这只是一个简单的隐式动画。但对于显式动画,结果相同。也许他会失去UIView动画方法,但他可以针对此情况使用显式核心动画。 - Kaan Dedeoglu
@Kaaan 我尝试了你的建议,使用transform属性确实有问题。如果我像这样设置变换:[label setTransform:CGAffineTransformMakeScale(1, 2)],标签确实会按需要增长,但文本大小也会放大并变得模糊。你知道如何在不影响文本的情况下应用UILabel的变换吗? - Mike

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