使用动画效果与UILabel控件

10

我有一个包含4个值的数组,它将用2个不同的UILabel呈现。 我将成对地分组值。在特定的时间,标签递归地更改为另一对中的另一个项目。

如果可能的话,我想要一个动画,比如淡出或者向左/向右滑动效果。

我已经查看了一些内容,但没有一个对我有意义。例如,这里是一个可行的动画(根据被接受的答案):

[UIView animateWithDuration:1.0 delay:0.f options:(UIViewAnimationOptionAutoreverse| UIViewAnimationOptionRepeat)
   animations:^{
   playerScore.alpha=1.f;
   } completion:^(BOOL finished){
   playerScore.alpha=0.f;
   }];

我不确定应该把这段代码放在哪里,是在一个单独的方法中还是在 viewDidLoad 中。能否给一些线索和信息?非常感谢。

2个回答

15

对我来说不清楚你为什么需要这么多的UILabel,因为当你更改当前UILabel中的文本时,你可以添加过渡动画

UILabel *textLabel = // ... whatever

[textLabel setText:@"Initial text what I just write accidentally"];

CATransition *transitionAnimation = [CATransition animation];
[transitionAnimation setType:kCATransitionFade];
[transitionAnimation setDuration:0.3f];
[transitionAnimation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
[transitionAnimation setFillMode:kCAFillModeBoth];
[textLabel.layer addAnimation:transitionAnimation forKey:@"fadeAnimation"];

[textLabel setText:@"New text will show after a nice fade effect"];

这是一个非常优雅和简单的解决方案。


更新(2016年1月6日)

注意:动画将在完成(或取消、失败或其他情况下)后自动删除,并且您需要注意为每个会话重新生成动画或通过将removedOnCompletion属性设置为FALSENO来显式地保持当前动画活动。


Holex,感谢您的回答。我只需要2个UILabel,因为我会将4个值分组成一对。在您的代码片段中,标签每0.3秒更改一次还是只更改一次? - Newbie iOS Developer
@NewbieiOSDeveloper,这只是一次性的,你可以将持续时间设置为任何你喜欢的时间。 - holex
3
我按照你的指示做了,但我甚至无法实现动画。而且改变了持续时间仍然没有效果。只能看到“New text…”字符串。出了什么问题?我将这些代码放在了我的viewDidLoad中。另一个问题是,我需要一个动画循环。不仅仅是时间。 - Newbie iOS Developer
@NewbieiOSDeveloper,只有在当前视图变得可见后,也就是已经在导航栈中时,动画才会显示出来。如果实际视图不可见,则实际视图中的动画也不会显示出来。 - holex

1

@holex的答案的Swift版本:

textLabel.text = "originalValue"

let textAnimation = CATransition()
textAnimation.type = kCATransitionFade
textAnimation.duration = 0.4

textLabel.layer.addAnimation(textAnimation, forKey: nil)
textLabel.text = "newValue"

如果您希望在动画完成后回调,请使用以下代码:
CATransaction.begin()
CATransaction.setCompletionBlock({
     print("Text Animation Complete!")
})

let textAnimation = CATransition()
textAnimation.type = kCATransitionFade
textAnimation.duration = 0.4

textLabel.layer.addAnimation(textAnimation, forKey: nil)
textLabel.text = "newValue"

CATransaction.commit()

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